写入位置时访问冲突
Posted
技术标签:
【中文标题】写入位置时访问冲突【英文标题】:Access violation when writing location 【发布时间】:2020-09-04 18:04:06 【问题描述】:所以我的代码应该这样工作: 该函数将 char**(字符串数组)和 char*(string)作为输入,还有 int 数。 然后,我必须将 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
【问题讨论】:
您的尺寸计算不正确。你应该分配sizeof(char *) * number
。这应该可以避免崩溃,但问题是您的分配不会反映在调用代码中,其中数组仍然包含指向(现在可能无效的)旧内存的指针。
【参考方案1】:
第一:
stringsArr = (char**)realloc(type, sizeof(char) * number);
应该是:
stringsArr = realloc(stringsArr, sizeof(char *) * number);
甚至更好:
stringsArr = realloc(stringsArr, sizeof(*stringsArr) * number);
注意sizeof
运算符的参数,不要从realloc
或malloc
转换返回值。
第二:
*(stringsArr + number - 1) = (char)malloc(sizeof(char) * strlen(string));
应该是:
stringsArr[number-1] = malloc(strlen(string) + 1);
sizeof(char)
的定义是 1,所以你不需要指定它。您需要为终止空值添加 1。数组索引表示法通常比指针表示法更容易理解。
第三,如果reason
实际上是一个有效的标识符而不是复制粘贴错误:
strcpy(*(stringsArr + number - 1), reason);
应该是:
strcpy(stringsArr[number - 1], string);
作为补充:
您应该始终检查malloc
和朋友的返回值。
所有以str
和小写字母开头的标识符都为标准库保留,因此您的stringsArr
和string
在技术上是非法的标识符。
【讨论】:
谢谢你的工作:) 关于你的第二个笔记,我知道我可以做到,但这是我想为我的班级做的(我的意思是他们双向工作)所以问题只出在第一行。 p.s,“原因”应该是字符串,我把我的名字改成了这些,如果让你失望了,对不起,我已经把它改成了“字符串”。以上是关于写入位置时访问冲突的主要内容,如果未能解决你的问题,请参考以下文章