0

为什么会出现以下段错误?

我正在使用标准 c99,带有 unix 的 icc 编译器。我不能让它没有段错误,我很好奇为什么。我对 strcat/strcpy 不太熟悉。

char *first = "First";
char *second = "Second";
char *both = (char *)malloc(strlen(first) + strlen(second) + 2);

strcpy(both, first);
strcat(both, " ");
strcat(both, second);

sprintf("%s %s", first, second);
4

2 回答 2

5
sprintf("%s %s", first, second);

的第一个参数sprintf是目标缓冲区。您已经给它一个常量字符串作为目标缓冲区。

如果你只是想打印一些东西,你的意思是printf

否则,正确使用将类似于:

// declaration of "dest" left as exercise for the reader
//
sprintf(dest, "%s %s", first, second);

虽然,sprintf已被 取代snprintf,但更好地避免缓冲区溢出。

于 2012-10-20T06:30:30.153 回答
0

sprintf 是“字符串 printf”,它打印到格式化的字符串。

sprintf 期望写入一个字符串目标指针(一个足够长度的可写缓冲区)。您传入的是一个 7 字节长的常量字符串文字。而且您正在尝试写入超过 7 个字节,这导致了段错误。

char *first = "First";
char *second = "Second";
char *both = (char *)malloc(strlen(first) + strlen(second) + 2);

strcpy(both, first); // unnecessary
strcat(both, " "); // unnecessary
strcat(both, second); //unnecessary

printf(both,"%s %s\0", first, second);
于 2012-10-20T06:33:28.207 回答