首页 > 解决方案 > 使用 strcat 会产生一个空字符串

问题描述

我正在学习 C 并试图制作一个小程序来了解字符串是如何工作的。使用strcat带有指向 a 的指针的函数char会产生一个空字符串,即使我认为我用 . 动态初始化了第一个指针malloc。如果两个字符串都已初始化,为什么会发生这种情况?

这是代码:

#include <string.h> 
#include <stdio.h>
#include <stdlib.h>

int main(void) 
{ 
    char *dest = (char*) malloc(sizeof(char) * 20);
    char *src = "World";

    dest = "Hello";

    printf("%s", strcat(dest, src)); // <-- gives an empty string
}

标签: cstringstrcat

解决方案


您已经更改了内存dest指向的区域。(请记住,dest是指针,而不是数组或内存本身。)

因此,您现在正尝试写入只读内存("Hello"字符串在内存中的位置),这会导致失败。

另一个后果是 获得的内存块malloc丢失了,因为您现在无法将其释放回内存管理器。在软件中,我们称之为“泄漏”,因为它会泄漏内存

要修复它,请使用strcpy将字符串复制"Hello"分配的内存位置,该位置既可写,而且在您编码时,大到足以容纳 19 个字符的字符串。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main() 
{ 
   char *dest = (char *)malloc(sizeof(char) * 20);
   char *src = "World";

   // copy hello to dest[], replacing what was there before
   strcpy(dest, "Hello");  

   // append src[] to dest[], return dest, print it
   printf("%s", strcat(dest, src)); 

   // don't forget to clean up!
   free(dest);
}

永远记住要注意字符串数组的大小,确保它们足够大,可以接受您希望附加(连接)到它们的所有内容。在这个例子中,它就足够了,但仍然非常非常小。

您还可以考虑添加一个空格来分隔字符串,并在输入末尾打印换行符或刷新输出流以保证立即输出。


推荐阅读