【发布时间】:2021-07-27 11:44:58
【问题描述】:
只需运行以下代码,我就会得到Bus error: 10(在运行时):
char *x;
char *y = "the quick";
sprintf(x, "%s brown fox jumps over the lazy dog", y);
Looking around看了几篇帖子,问题好像是我想修改一个字符串文字,但是在上面的代码中,我想,我不是。
此外,如果我尝试使用malloc 为x 分配一些内存,一切正常,而且如果我分配的内存少于存储整个字符串所需的内存,即使我分配0,它也可以工作。
char *x = malloc(0);
char *y = "the quick";
sprintf(x, "%s brown fox jumps over the lazy dog", y);
printf("%s\n", x); // the quick brown fox jumps over the lazy dog
我也知道这在某种程度上与内存分配有关,但我想指定 x 而不告诉编译器它将占用多少内存,因为 y 可能是一个非常长的字符串,甚至是一个数字...
我应该如何做我想做的事,只使用字符指针(而不是字符数组),而不必知道x 的最终长度,例如无需计算x 的最大大小,然后分配内存?
【问题讨论】:
-
覆盖未分配的内存会导致未定义的行为。“未定义的行为”包括“显然工作正常”。
-
char *y = "the quick";将字符串文字分配给指针y-- 没有尝试修改。char *x = malloc(0);调用未定义的行为,因为要分配的大小必须大于0。当您尝试sprintf(x, "%s brown fox jumps over the lazy dog", y);BOOM SegFault 时,您没有有效分配的内存。 -
@Jabberwocky 我应该如何在不使用字符数组或指定
x的最终大小的情况下将这两个字符串连接在一起? -
@Giuppox 在下面看到我的回答