写入位置时发生访问冲突

问题描述 投票:0回答:1

所以我的代码应该这样运行:该函数将输入char **(字符串数组)作为输入,而只是char *(string)作为输入,也是整数。然后,我必须将char **重新分配给该数字,并将字符串添加到他的最后一个指针中。这是我的写法:

void addReason(char** stringsArr, char* string, int number)
{
    stringsArr = (char**)realloc(type, sizeof(char) * number);
    *(stringsArr + number - 1) = (char)malloc(sizeof(char) * strlen(string));
    strcpy(*(stringsArr + number - 1), string); // the exception thorws here, 
//talking about the *(stringsArr + number - 1) pointer
}
c pointers heap dynamic-memory-allocation realloc
1个回答
0
投票

第一:

stringsArr = (char**)realloc(type, sizeof(char) * number);

应该是:

stringsArr = realloc(stringsArr, sizeof(char *) * number);

甚至更好:

stringsArr = realloc(stringsArr, sizeof(*stringsArr) * number);

请注意sizeof运算符的参数,不要将reallocmalloc的返回值强制转换。

第二:

*(stringsArr + number - 1) = (char)malloc(sizeof(char) * strlen(string));

应该是:

stringsArr[number-1] = malloc(strlen(string) + 1);

sizeof(char)根据定义为1,因此无需指定。您需要为终止null添加1。数组索引符号通常比指针符号更易于遵循。

第三,偶然地,reason实际上是有效的标识符,而不是复制粘贴错误:

strcpy(*(stringsArr + number - 1), reason);

应该是:

strcpy(stringsArr[number - 1], string);

作为附加点:

  1. 您应该始终检查malloc和朋友的返回值。

  2. 所有以str开头的标识符和小写字母都保留用于标准库,因此stringsArrstring从技术上讲是非法标识符。

  3. 如评论中所述,您不会返回新指针,因此您将新内存泄漏到这里,但是由于您的代码显然仍然无法编译,因此可能还有更多代码没有显示给我们。

© www.soinside.com 2019 - 2024. All rights reserved.