违规进入时写位置

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

所以,我的代码应该是这样工作的:函数得到一个char**(字符串数组)作为输入,只是char*(字符串),也是int number.然后,我必须将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
投票

首先,我必须将char**重新分配给数字,并加到最后..:

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.