strcat给segfault

时间:2012-10-20 06:28:20

标签: c

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

我正在使用带有unix的标准c99,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);

2 个答案:

答案 0 :(得分: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取代,但最好避免缓冲区溢出。

答案 1 :(得分:0)

sprintf是“string 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);