首页 > 解决方案 > Char** 结构成员无效写入

问题描述

我有以下结构

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 错误。有什么帮助吗?

标签: arrayscstringvalgrind

解决方案


如果你这样定义它

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();

推荐阅读