为什么 C 的 strcpy 使用双索引数组会失败?

发布于 2024-10-18 15:12:15 字数 208 浏览 6 评论 0原文

下面的代码似乎出现了段错误,我不明白为什么。

#include <string.h>

static char src[] = "aaa";

int main()
{
   char* target[2] = {"cccc","bbbbbbbbbb"};
   strcpy(target[1],src);
   return 0;
}

The following code seems to segfault and I cannot figure out why.

#include <string.h>

static char src[] = "aaa";

int main()
{
   char* target[2] = {"cccc","bbbbbbbbbb"};
   strcpy(target[1],src);
   return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

护你周全 2024-10-25 15:12:15

因为 target[1] 是指向 "bbbbbbbbbb" 的指针,并且不允许修改字符串常量。这是未定义的行为。

这与:

char *x = "bbb";
x[0] = 'a';

我认为您可能将其与:

char x[] = "bbb";
x[0] = 'a';

which有效相混淆,因为它创建了一个允许您修改的数组。但是你的给你的是:

char* target[2] = {"cccc","bbbbbbbbbb"};

一个指针数组,所有这些都指向不可修改的内存。

如果您尝试一下:

char t0[] = "cccc";
char t1[] = "bbbbbbbbbb";
char* target[2] = {t0, t1};
strcpy(target[1],src);

您会发现它可以工作,因为 target[1] 现在指向可修改的 t1

Because target[1] is a pointer to "bbbbbbbbbb" and you are not allowed to modify string constants. It's undefined behaviour.

It's no different to:

char *x = "bbb";
x[0] = 'a';

I think you may be confusing it with:

char x[] = "bbb";
x[0] = 'a';

which is valid since it creates an array that you are allowed to modify. But what yours gives you:

char* target[2] = {"cccc","bbbbbbbbbb"};

is an array of pointers, all of which point to non-modifiable memory.

If you were to try:

char t0[] = "cccc";
char t1[] = "bbbbbbbbbb";
char* target[2] = {t0, t1};
strcpy(target[1],src);

you would find that it works since target[1] now points to t1, which is modifiable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文