繁体   English   中英

c strcat覆盖源字符串吗?

[英]c strcat overwrite source string?

我是一位努力学习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"
----------------------------------------------

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

另外...您将如何在GDB中调试此功能? 我尝试了“逐步”以进入strcat()函数,但是我猜想调试器没有对函数进行分析。 “步骤”什么也没做。

谢谢! -ROA

PS-一个简短的说明,我确实阅读了该网站上类似的strcat()帖子,但没有看到一个似乎直接适用于我的问题的帖子。 抱歉,我错过了发布的帖子。

您的目的地没有分配足够的内存来容纳新的串联字符串。 在这种情况下,这意味着src可能会被strcat覆盖,因为它写入的内容超出了dst的范围。

为dst分配足够的内存,并且它应该在不覆盖源字符串的情况下工作。 请注意,容纳串联字符串的新内存段至少应为两个字符串的大小(在您的情况下为36)加上空终止符的空间。

是的,如果您的背景严格是Java,那么我肯定与手动内存管理有关的所有事情都会遇到一些困难。

关于与C字符串有关的任何事情,将您对Java String的了解都超出您的范围可能会很有用。 C字符串最接近的Java类似物是char[]byte[] 但是,即使在那里,您也可能会遇到麻烦,因为Java为您执行了边界检查,而C却没有。 实际上,C允许您做所有不该做的事情,同时站着静静地喃喃地说:“谁知道您这样做会发生什么 ?”。

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

一般来说,您需要执行以下一项或多项操作:

  • 对可能需要的大小有硬性上限,并至少分配那么多空间,或者
  • 知道您有多少空间,并在该空间内工作(例如,截断任何多余的空间),或者
  • 跟踪您有多少空间以及需要多少空间,并根据需要分配更多空间(请确保以后不再需要时释放所有动态分配的空间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM