【问题标题】:Access Violation, memset访问冲突,memset
【发布时间】:2013-08-18 12:27:35
【问题描述】:

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

【问题讨论】:

    标签: c access-violation


    【解决方案1】:
    *word = (char *)malloc(30);
    [...]
    *word = "Hello";
    

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

    (例如看这个问题:Is modification of string literals undefined behaviour according to the C89 standard? - 在你的情况下,"Hello" 是一个字符串文字。你让word 指向第二个赋值。所以你不能修改@987654326 的数据@ 指向之后。)

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

    【讨论】:

    • 我想补充一点,“Hello”是程序静态数据的一部分,可能真的是只读内存。 OP 很幸运,因为如果不是,他会覆盖接下来的内容......
    • 非常感谢马特。在我的原始代码中,我没有为 *word 分配一些东西,我实际上是使用 **word = some_char 来填充它。但是,我确实对 *word 进行了一些指针运算,在该算法上我丢失了原始 *word,导致所有地狱都被丢失,正如您所指出的那样!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 2013-02-26
      • 2015-04-23
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多