我想要** char FinalString
,即*char
列表。我的函数运行后,每个 *char
指针包含一个 char
'A'、'B'、'C',然后可以将其传递给需要参数的函数输入char**
。每个字符串必须是单独的,但位于同一数组中,因此是 **
。
创建这个**char
,我写了以下内容:
char ** finalString;
finalString = malloc(sizeof(char*)*3);
int stringAddressCounter = 0;
然后,为了向其中添加一个字符,我尝试了以下操作:
char ** nextStringAddress = finalString + stringAddressCounter;
** nextStringAddress = 'A';
stringAddressCounter++;
但是,我在该 block 的第二行遇到段错误。
我做错了什么?
最佳答案
您为 char*
分配了内存,但没有为要存储的 char
分配内存。
这是指针的经验法则,每个 * 都应该有一个 malloc,这意味着对于 char **
,您应该为 char *
分配一个 malloc,为 分配另一个 malloc >字符
。
有时使用指针会有点误导,应该使用括号来提高可读性
char ** nextStringAddress = finalString + stringAddressCounter;
nextStringAddress[stringAddressCounter] = malloc(sizeof **nextStringAddress * 3)
nextStringAddress[stringAddressCounter][0] = 'A';
nextStringAddress[stringAddressCounter][1] = 'a';
nextStringAddress[stringAddressCounter][2] = '\0';
stringAddressCounter++;
也可以像这样使用单个 malloc
char ** nextStringAddress = finalString + stringAddressCounter;
nextStringAddress[stringAddressCounter] = "Aa";
stringAddressCounter++;
请注意这里 Aa
周围的双引号以及缺少的第二个括号。
应该注意的是,通过这样做,您实际上是在分配一个只读的内存区域,并且通过尝试在该内存上分配,将会导致段错误。
关于c - malloc 之后出现段错误 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295267/