【问题标题】:Bus error when appending to C array附加到 C 数组时出现总线错误
【发布时间】:2012-09-10 09:16:44
【问题描述】:

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

#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 arrays string concatenation


    【解决方案1】:

    传递给函数的“Hello”参数实际上位于程序的 .data 部分。您无权修改此部分。任何这样做的尝试都会给您带来错误(在您的情况下是总线错误)。

    您只能操作位于堆栈(局部变量和数组)或堆(使用 [mc]alloc() 函数分配的内存)中的那部分内存。

    【讨论】:

      【解决方案2】:

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

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

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

      char mystring[1024] = "Hello!";
      

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

      动态地,声明看起来像

      char *mystring = malloc(1024);
      

      获得一个足够大的未初始化缓冲区以容纳 1024 个字符(计算空终止符)。但是,如果您 malloc 某些东西,您必须稍后再 free 它,否则您最终会出现内存泄漏。把东西放进去,做

      strcpy(mystring, "Hello!");
      

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

      【讨论】:

      • 因为它再次使用字符串的静态定义而不是表示为字符数组的定义? (不确定这是否正确,但无论哪种方式,这个答案确实帮助我至少开始理解这个概念......非常感谢!)
      • 是的! mystring = "Hello!" 将使mystring 再次指向静态字符串。坚持下去:很快一切都会变得有意义:)
      【解决方案3】:

      问题:

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

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

      解决方案:

      如果你想得到一个包含两个字符串文字的字符串,那么你需要执行以下操作:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-04-03
          • 2014-05-20
          • 2017-12-07
          • 2015-10-30
          • 1970-01-01
          • 1970-01-01
          • 2014-09-28
          • 1970-01-01
          • 2011-03-23
          相关资源
          最近更新 更多