gpt4 book ai didi

c - 追加到 C 数组时出现总线错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:00 26 4
gpt4 key购买 nike

我在尝试手动连接两个没有库函数的字符串时遇到总线错误(学校作业)。代码如下:

#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 的副本,但这让编译器对我大喊大叫,因为我从函数返回局部变量。

非常感谢任何帮助。谢谢!

最佳答案

您是正确的,因为您正在尝试修改静态(只读)字符串;这样做就是 C 标准术语“未定义行为”(在您的情况下表现为崩溃)。

要解决此问题,您需要分配一个可以修改的字符数组。您可以静态(在堆栈上)或动态(使用 malloc)执行此操作。

静态地,要用特定内容初始化一个字符数组,你可以这样做

char mystring[1024] = "Hello!";

这将使用字符串内容初始化字符数组,并复制它们(请注意,类似的 char *mystring = "Hello!"; 不是数组初始化,并将改为使 mystring 指向静态字符串)。您可以将该声明放在全局范围内(在任何函数之外,不推荐,除非您有使用全局的特定原因),或者放在您的 main 方法中(然后您可以将它传递给 strcattest).

动态地,声明看起来像

char *mystring = malloc(1024);

获得一个大到足以容纳 1024 个字符(包括空终止符)的未初始化缓冲区。但是,如果您malloc 一些东西,您必须稍后free 它,否则您将以内存泄漏告终。要在里面放东西,做

strcpy(mystring, "Hello!");

注意 mystring = "Hello!" 在这种情况下不起作用:为什么不呢?

关于c - 追加到 C 数组时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12471411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com