访问违规写入静态全局变量?

时间:2012-04-30 18:17:43

标签: c string

给出以下代码:

#include "stdafx.h"
#include "string.h"
static char *myStaticArray[] = {"HelloOne", "Two", "Three"};

int _tmain(int argc, _TCHAR* argv[])
{
    char * p = strstr(myStaticArray[0],"One");
    char hello[10];
    memset(hello,0,sizeof(hello));
    strncpy(hello,"Hello",6);
    strncpy(p,"Hello",3); // Access Violation
    return 0;
}

我正在尝试写入myStaticArray [0]的地址时出现访问冲突。 为什么这是一个问题?

背景:我将旧的C ++移植到C#主要是C#开发人员,所以请原谅我的无知!这段代码显然不是旧版本中的问题,所以我很困惑......

3 个答案:

答案 0 :(得分:5)

char * p = strstr(myStaticArray[0],"One");

p指向字符串文字“HelloOne”的一部分。您不能尝试修改字符串文字,这是未定义的行为。

通常,字符串文字存储在内存的只读部分,因此尝试写入它们会导致分段错误/访问冲突。

答案 1 :(得分:2)

 static char *myStaticArray[] = {"HelloOne", "Two", "Three"};

数组中的字符串是字符串文字,在C和C ++中是不可修改的。

strncpy(p,"Hello",3);

此函数调用尝试修改字符串文字。

另一个问题是你使用的strncpy函数并不总是null终止字符串。这是这种情况,因为strlen("Hello")大于3(您的上一个strncpy参数)。

答案 2 :(得分:0)

如果您希望能够修改字符串,那么您需要像这样分配字符数组

static char myStaticArray[][25] = {"HelloOne", "two", "three"};

问题正如其他人所说的那样,你的方法会导致编译器创建一个包含3个指向常量字符串的数组。上面的声明创建了一个两个dementional字符数组,然后将常量字符串数据复制到该内存。