附加到C数组时出现总线错误

时间:2012-09-18 06:22:09

标签: c arrays string concatenation

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

#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的副本,但是让编译器大吼大叫让我从函数中返回一个局部变量。

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

4 个答案:

答案 0 :(得分:1)

您尝试将字符串文字连接到另一个字符串文字。这些字符串文字除了太短之外,还只读

答案 1 :(得分:1)

问题:

printf("Hello plus Hello: %s\n", strcattest("Hello","Hello")); 

这里的字符串"Hello"是字符串文字,放在实现定义(只读)内存中。您无法修改它们。修改它们会导致未定义的行为。所以你不能简单地将字符串文字附加到另一个,因为它们不是可修改的。

解决方案:

如果你想获得一个用两个字符串文字填充的字符串,那么你需要执行以下操作:

  1. 在函数中有一个指向动态内存分配(malloc)缓冲区的指针。
  2. 在此缓冲区中附加字符串文字,您可以修改其内容,因为内存归您所有。
  3. 返回指向此动态分配内存的指针。
  4. 不要忘记释放(免费)返回的指针。

答案 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()函数分配的内存)。