0

以下代码在运行时在第 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 );
}  
4

2 回答 2

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

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

(例如参见这个问题:Is modify of string literals undefined behavior based on the C89 standard? - 在你的情况下,"Hello"是一个字符串文字。你word用第二个赋值来指出它。所以你不能修改word指向的数据到后来。)

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

于 2013-08-18T12:30:52.880 回答
0

你应该知道, 之后*word = "Hello", 的值*word是常数区域,你可以改变这个区域的内容。

于 2013-08-18T12:58:14.623 回答