【问题标题】:Char** struct member Invalid WriteChar** 结构成员无效写入
【发布时间】:2021-12-09 01:03:39
【问题描述】:

我有以下结构

typedef struct mystr{
  char** str;
}*mystr;

main 中的定义

mystr mst = NULL;
init(&mst);

我想在这个函数中初始化

void init(mystr* m){
  *m = malloc(sizeof(mystr*));
  (*m)->str = malloc(sizeof(char*)*2);  /*dynamic array of strings with 2 indexes */
}

但是,函数代码的最后一行在分配块后会导致无效写入和地址 0 字节的 valgrind 错误。有什么帮助吗?

【问题讨论】:

  • 您可能错过了另一层分配。您的意思是用 malloc 块初始化每个 char* 吗?
  • 不要 typedef 指针。它只会使代码更难理解。这可能是导致此代码最终出错的重要原因。
  • @Abel 那将是下一步,但是甚至数组分配都不起作用,所以我没有着手分配每个索引。
  • typedef struct mystr *mystr; 可能是一个错误。 sizeof(mystr*) 也是如此
  • 尝试使用“typedef struct S_MyStruct { char** str; } MyStr, * P_MyStr;”之类的东西重写你的代码。这清楚地表明了哪个是结构名称,结构名称的 typedef 和指向结构的指针的 typedef。

标签: arrays c string valgrind


【解决方案1】:

如果你这样定义

typedef struct mystr{
  char **str;
}mystr;

malloc()返回一个指针,如果你init()你必须记住C将参数的值复制到堆栈中。

void init( mystr ** _mystr )
{
  *_mystr = malloc( sizeof(mystr));
  (*_mystr)->str = malloc( sizeof(char*) * 2 );
}

你使用它就像

mystr *mystr;

init( &mystr );

另一个避免双指针的版本是

mystr *initMystr()
{ 
  mystr *_mystr = malloc( sizeof(mystr));
  _mystr->str = malloc( sizeof(char*) * 2 );
  
  return _mystr;
}

mystr *mystr = initMystr();

【讨论】:

    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2017-04-23
    • 2017-01-18
    • 2018-03-16
    • 2018-10-19
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    相关资源
    最近更新 更多