Viv*_*Jay 0 c access-violation
以下代码在运行时在第L2行引发访问冲突,这发生在第二次调用setword期间.
问:我在L2中哪里出错了,为什么第一行的第一个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 );
}
Run Code Online (Sandbox Code Playgroud)
*word = (char *)malloc(30);
[...]
*word = "Hello";
Run Code Online (Sandbox Code Playgroud)
第二个赋值会产生内存泄漏(您丢失了malloc返回的指针),并word指向可能只读的内存 - 对它的任何写访问都将导致未定义的行为.
(例如,请参阅此问题:根据C89标准修改字符串文字未定义的行为吗? - 在您的情况下,"Hello"是一个字符串文字.您word使用第二个赋值指出.所以您无法修改word指向的数据之后.)
使用strcpy复制"hello"到您的动态分配的缓冲区.
| 归档时间: |
|
| 查看次数: |
958 次 |
| 最近记录: |