gpt4 book ai didi

c - 访问冲突,内存集

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:52 28 4
gpt4 key购买 nike

以下代码在运行时在 L2 行抛出访问冲突,这发生在第二次调用 setword 期间。

Q> L2哪里出错了,为什么L1行的第一个memset没有问题?

注意:我已尝试将问题区域与更大的代码隔离开来,希望这能提供足够的信息。

void setword( char ** word )
{
if ( *word == NULL )
{
*word = (char *)malloc(30);
memset( *word, '\0', 30 ); //L1: OK
}
else
{
memset( *word, '\0', 30 );//L2: Access violation
}

*word = "Hello";
//*word shall be freed when operations are complete.
}
int main()
{
char * word = NULL;

setword( &word ); //Call 1: OK
printf( "%s\n", word );

setword( &word ); //Call 2: NOK!
printf( "%s\n", word );
}

最佳答案

*word = (char *)malloc(30);
[...]
*word = "Hello";

第二个赋值会产生内存泄漏(您丢失了 malloc 返回的指针),并使 word 指向潜在的只读内存 - 对它的任何写访问都将导致未定义的行为.

(参见这个问题的例子:Is modification of string literals undefined behaviour according to the C89 standard? - 在你的例子中,"Hello" 是一个字符串文字。你让 word 通过第二个赋值指向它.所以你之后不能修改word指向的数据。)

使用 strcpy"hello" 复制到动态分配的缓冲区。

关于c - 访问冲突,内存集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299063/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com