我遇到了一个总线错误,试图在没有库函数的情况下手动连接两个字符串(学校作业)。代码如下:
#include <stdio.h>
char *strcattest(char string1[ ], char string2[ ]);
int main() {
printf("*****STRING CONCATENATION*****\n");
printf("Hello plus Hello: %s\n", strcattest("Hello","Hello"));
printf("Hello plus Hellp: %s\n", strcattest("Hello","Hellp"));
printf("Helo plus Hello: %s\n", strcattest("Helo","Hello"));
printf("Hello plus Helo: %s\n", strcattest("Hello","Helo"));
return(0);
}
char *strcattest(char string1[ ], char string2[ ]) {
int counter = 0;
while(string1[counter]!='\0') {
counter++;
}
int str2counter = 0;
while(string2[str2counter]!='\0') {
string1[counter] = string2[str2counter];
str2counter++;
counter++;
}
string1[counter]='\0';
return string1;
}
我做了一些研究,我认为我从概念上理解为什么这不起作用。 (我正在尝试修改一个变量 - string1 - 它基于一个静态字符串。)但是,我不确定如何纠正它,以便它自己行动。我尝试在strcattest函数中引入一个局部变量,它将作为string1的副本,但是让编译器大吼大叫让我从函数中返回一个局部变量。
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
您尝试将字符串文字连接到另一个字符串文字。这些字符串文字除了太短之外,还只读。
答案 1 :(得分:1)
问题:
printf("Hello plus Hello: %s\n", strcattest("Hello","Hello"));
这里的字符串"Hello"
是字符串文字,放在实现定义(只读)内存中。您无法修改它们。修改它们会导致未定义的行为。所以你不能简单地将字符串文字附加到另一个,因为它们不是可修改的。
解决方案:
如果你想获得一个用两个字符串文字填充的字符串,那么你需要执行以下操作:
答案 2 :(得分:1)
你是正确的,因为你试图修改一个静态(只读)字符串;这样做是C标准术语“未定义的行为”(在您的情况下表现为崩溃)。
要解决此问题,您需要分配可以修改的字符数组。您可以静态地(在堆栈上)或动态地(使用malloc
)执行此操作。
静态地,要初始化具有特定内容的字符数组,您可以执行
char mystring[1024] = "Hello!";
这将使用字符串内容初始化字符数组,复制它们(注意看起来相似的char *mystring = "Hello!";
不数组初始化,而是生成mystring
指向静态字符串)。您可以将该声明放在全局范围内(任何函数之外,不推荐,除非您有特定理由使用全局),或者使用main
方法(然后您可以将其传递给strcattest
)。
动态地,声明看起来像
char *mystring = malloc(1024);
获取一个未初始化的缓冲区,大小足以容纳1024个字符(计算空终止符)。但是,如果你malloc
某事,你必须稍后free
,否则你最终会发生内存泄漏。要把东西放进去,做
strcpy(mystring, "Hello!");
请注意,mystring = "Hello!"
在这种情况下不起作用:为什么不呢?
答案 3 :(得分:1)
&#34;你好&#34;传递给函数的参数实际上位于程序的.data部分。您不能修改此部分。任何尝试这样做都会给你错误(在你的情况下总线错误)。
只允许操作堆栈中的那部分内存(局部变量和数组)或堆(使用[mc] alloc()函数分配的内存)。