c - 通过将第二个字符串的字符一个接一个地复制到第一个字符串的末尾来合并两个字符串
问题描述
这个程序它应该打印 Hello World 但猜猜什么退出了,为什么会发生分段错误?
#include <stdio.h>
#include <string.h>
char f(char *a, char *b)
{
int i , m, n;
m = strlen(a);
n = strlen(b);
for (i = 0; i<=n; i++)
{
a[m+i] = b[i];
}
}
int main() {
char*str1 = "hello ";
char*str2 = "world!";
str1=f(str1, str2);
printf("%s", str1);
return 0;
}
解决方案
不允许修改字符串文字。使用具有足够元素的数组代替要修改的字符串。
f
同样分配to的返回值str1
也是一个坏主意,因为return
在函数中没有执行任何语句,f
并且使用它的返回值会调用未定义的行为。void
如果您不打算返回任何内容,则应将返回类型更改为。
#include <stdio.h>
#include <string.h>
void f(char *a, char *b)
{
int i , m, n;
m = strlen(a);
n = strlen(b);
for (i = 0; i<=n; i++)
{
a[m+i] = b[i];
}
}
int main() {
char str1[16] = "hello ";
char*str2 = "world!";
f(str1, str2);
printf("%s", str1);
return 0;
}
推荐阅读
- javascript - 本地存储/会话存储在本地文件系统的 IE 中不起作用
- git - Git:跟踪远程仓库+能够更改其中的文件
- python - 确定在 python 中从哪个文件中定义函数
- java - 没有任何特定消息的 TTransportException
- javascript - 如何使用 async.eachOfSeries
- json - localhost 中的 Access-Control-Allow-Origin 使用 odoo 和 ajax 方法发布 Api
- flyway - 当目标数据库比类路径中存在的最后一个迁移更新时,如何防止飞行路径回调运行?
- php - 如何将json响应数据转换为xml
- socialengine - 在社交引擎 php 中创建水平菜单
- java - Spring Boot 1.5.8 中的内存泄漏