给出以下代码:
#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#开发人员,所以请原谅我的无知!这段代码显然不是旧版本中的问题,所以我很困惑......
答案 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字符数组,然后将常量字符串数据复制到该内存。