0

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

#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

4 回答 4

1

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

于 2012-09-18T06:25:43.283 回答
1

问题:

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

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

解决方案:

如果您想获得一个带有两个字符串文字的字符串,那么您需要执行以下操作:

  1. 在函数中有一个指向动态内存分配(malloc)缓冲区的指针。
  2. 在此缓冲区中附加字符串文字,您可以修改其内容,因为内存归您所有。
  3. 返回指向此动态分配内存的指针。
  4. 不要忘记释放(释放)返回的指针。
于 2012-09-18T06:27:37.300 回答
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!"在这种情况下将不起作用:为什么不呢?

于 2012-09-18T06:31:48.393 回答
1

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

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

于 2012-09-18T11:23:43.580 回答