为什么会出现以下段错误?
我正在使用带有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);
答案 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);