char *test={"0x11","0x12","0x13","0x00","0x00"};
void change(char* test1, char* test2){
strncpy(test[3], test1, 4);
strncpy(test[4], test2, 4);
}
chage("0x55","0x66");
我可以直接将字符分配给数组元素。但是,它会导致内存泄漏。这就是我改用 strncpy()
的原因。
如果您知道如何修复它,请告知。
最佳答案
至少有三两个你可以在这里得到段错误(一个建议是启用编译器警告 - 他们经常会发现“愚蠢的错误”)。
问题是 test
可能被错误声明了,它应该是:
char *test[]={"0x11","0x12","0x13","0x00","0x00"};
您使用 char*
数组初始化 char*
,这意味着您使用该数组中的第一个指针初始化 test
- 这意味着 test
将指向字符串文字 "0x11"
,因此当您使用 test[3]
作为 strncpy< 的参数时
你将发送 1
,它被转换为一个指针(可能指向地址 0x31
)。 strncpy
然后会尝试写入最有可能不允许的地址。你在这里有近第四个原因,如果你使用了 test[5]
你会要求访问超出不允许的字符串末尾(你可以访问 test[4]
因为它是字符串的终止空值)。
即使您解决了这些问题,仍然存在问题,因为 test[3]
和 test[4]
是使用字符串文字初始化的。然后 strncpy
将尝试修改未定义行为的字符串文字 - 段错误是因为 test[3]
和 test[4]
驻留在只读内存(允许它们在只读内存中是修改字符串文字是未定义行为的原因之一)。
你本可以做的是确保你在 test
中有可写的副本,这在 C 中可能不是那么简单。一个正常的解决方案是有一个函数(你必须手动调用)设置测试
,以及将其拆除的:
void init_test(void) {
int j;
for(j=0; j<sizeof(test)/sizeof(test[0]); j++)
test[j] = strdup(test[j]);
}
void init_fini(void) {
int j;
for(j=0; j<sizeof(test)/sizeof(test[0]); j++)
free(test[j]);
}
关于C - strncpy 用法 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38198473/