c strcat覆盖源字符串?

时间:2016-09-15 20:40:33

标签: c strcat

我是一名努力学习C语言的Java程序员。特别是,我正在努力理解strcat()。如果我打电话:

strcat(dst, src);

我得到strcat()会修改我的dst String。但是它不应该单独保留src String吗?请考虑以下代码:

#include<stdio.h>
#include<string.h>

void printStuff(char* a, char* b){
        printf("----------------------------------------------\n");
        printf("src: (%d chars)\t\"%s\"\n",strlen(a),a);
        printf("dst: (%d chars)\t\"%s\"\n",strlen(b),b);
        printf("----------------------------------------------\n");
}

int main()
{
        char src[25], dst[25];
        strcpy(src,  "This is source123");
        strcpy(dst,  "This is destination");

        printStuff(src, dst);
        strcat(dst, src);
        printStuff(src, dst);

        return 0;
}

在我的Linux机器上生成此输出,使用GCC进行编译:

----------------------------------------------
src: (17 chars) "This is source123"
dst: (19 chars) "This is destination"
----------------------------------------------
----------------------------------------------
src: (4 chars)  "e123"
dst: (36 chars) "This is destinationThis is source123"
----------------------------------------------

我假设完整的&#34;这是source123&#34;字符串仍在内存中,strcat()已将char * src指针前进13个字符。但为什么?为什么13个字符?我已经使用了dst字符串的长度,并且在strcat()完成后它肯定会对src指针产生影响。但我不明白为什么......

另外......在GDB中你会如何调试呢?我试过&#34; step&#34;进入strcat()函数,但我猜这个函数没有被调试器分析; &#34;步骤&#34;什么都没做。

谢谢!         -ROA

PS - 一个快速说明,我确实通过本网站上的类似strcat()帖子阅读,但没有看到似乎直接适用于我的问题。如果我错过了这个帖子,我会道歉。

2 个答案:

答案 0 :(得分:5)

您的目标没有足够的内存来保存新的连接字符串。在这种情况下,这意味着src可能被strcat覆盖,因为它写的超出了dst的范围。

为dst分配足够的内存,它应该在没有覆盖源字符串的情况下工作。 请注意,保存连接字符串的新内存段至少需要两个字符串的大小(在您的情况下为36)以及空终止符的空格。

答案 1 :(得分:1)

是的,如果您的背景是严格的Java,我确定与手动内存管理有关的一切都会遇到一些困难。

对于与C字符串相关的任何内容,将您所知道的关于Java String的所有信息都放在脑后可能会很有用。 C字符串最接近的Java类似物是char[]byte[]。但是,即使在那里你也会遇到麻烦,因为Java会为你执行边界检查,但C却没有。事实上,C允许你做各种你不应该做的事情,一直站着,静静地喃喃自语,&#34;谁知道会发生什么如果你做的话?那&#34;

特别是,当您调用strcat()或写入char数组的任何其他函数时,您负责确保目标数组中有足够的空间容纳人物。如果没有,那么结果行为是未定义的(谁知道会发生什么?)。你只是运用了这种未定义的行为。

一般来说,您需要做以下一项或多项工作:

  • 对可能需要的大小设置一个硬上限,并至少分配那么多空间,或
  • 知道你有多少空间,并在那个空间内工作(例如截断任何多余的空间),或
  • 跟踪您拥有多少空间以及您需要多少空间,并根据需要分配更多空间(确保以后免费所有动态分配的空间,当您不再需要它时)。
相关问题