C - strncpy 用法 - 段错误

标签 c strncpy

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/

相关文章:

c - C语言的猜字游戏

c++ - 如何快速复制 std::string 内容?

c - 关于 strcat()、strncpy()、strncat() 等字符串函数的问题?

c - 为什么 strncpy not null 终止?

C : Why the size of my pizza is not 10 bytes?

c - 三元(条件)表达式的类型错误

c - 如何显示uid、大小和文件类型?

c - 由于 strncpy 检测到堆栈崩溃

c - 如何在 C 中将 strncpy 与 for 循环一起使用?

c - 为什么 C 预处理器将单词 "linux"解释为常量 "1"?