写入位置时访问冲突

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 运算符的参数,不要从reallocmalloc 转换返回值。

第二:

*(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 和小写字母开头的标识符都为标准库保留,因此您的stringsArrstring 在技术上是非法的标识符。

    1234563向我们展示。

【讨论】:

谢谢你的工作:) 关于你的第二个笔记,我知道我可以做到,但这是我想为我的班级做的(我的意思是他们双向工作)所以问题只出在第一行。 p.s,“原因”应该是字符串,我把我的名字改成了这些,如果让你失望了,对不起,我已经把它改成了“字符串”。

以上是关于写入位置时访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

写入位置时访问冲突

opencv中的访问冲突写入位置

memcpy():访问冲突写入位置

链表访问冲突写入位置

使用 log4cpp 时访问冲突写入位置

0xC0000005: 写入位置 0x0000000002450040 时发生访问冲突