c - 使用 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
}
解决方案
您已经更改了内存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);
}
永远记住要注意字符串数组的大小,确保它们足够大,可以接受您希望附加(连接)到它们的所有内容。在这个例子中,它就足够了,但仍然非常非常小。
您还可以考虑添加一个空格来分隔字符串,并在输入末尾打印换行符或刷新输出流以保证立即输出。
推荐阅读
- java - 以编程方式访问 build.gradle 内容
- c++ - 如何在点击时动态创建多个控件
- sql - 我得到不一致的查询结果
- elasticsearch - Metricbeat-Kafka-Logstash 配置
- c++ - 使用 utf8 格式的正则表达式过滤字符串
- java - Future.get 无法阻塞 forkjoinpool/workstealingpool 中的线程
- python - 在 OS X/macOS 上意外删除了 /usr/bin/python 而不是 /usr/local/bin/python,如何恢复?
- aws-lambda - 无服务器框架,API 网关 URL 何时更改?
- css - 这个LESS变量@grid-breakpoints的语法是什么:xs 0,sm 576px,md 768px,lg 992px,xl 1200px;
- c# - 如何正确隐藏 runat="server" div?