不确定 strcpy 在这种情况下如何工作

Unsure how strcpy works in this situation

我是 C 语言的新手,通过一个项目来激励我学习。我很难从 sh popen 获得输出。经过大量搜索和数小时的试用,我偶然发现了一个非常古老的 post,他们曾在那里使用

strcpy(str + size - 1,buf);

这是我能找到的第一个也是唯一一个例子,而且它正在运行。看起来它用 buf 中的内容覆盖了 str 末尾的终止字符。那安全吗?我仍然没有完全理解它是如何存储所有这些数据的,并将最后的数字更改为高于 +2 的任何值会导致分段错误或下一个大小无效。完整代码如下

int dns_probe(char * hostname)
{
    char * digLoop[4] = {"ns ","a ","cname ","mx "};
    int i;
    char outage[1];
    char *str = NULL;
    char *temp = NULL;
    unsigned int size = 1;
    unsigned int strlength;

    for ( i = 0; i < 4; i++)
    {
        char *digcmd = concatCMD(digLoop[i],hostname);

        FILE * dig = popen(digcmd,"r");
        char bufer[256];
        while(fgets(buf,sizeof(buf),dig) != 0){

            strlength = strlen(buf);

            temp = realloc(str, size + strlength);
            str = temp;

            strcpy(str + size - 1,buf);
            size += strlength;
        }

       pclose(dig);
       free(digcmd);

    }
    printf("%s",str);
}

真的只是想确保我不会在未来遇到问题。

是的,只要 realloc() 确保缓冲区足够大(确实如此),这是安全的。

realloc() 之前你可能有:

     +---+---+---+----+
buf: | f | o | o | [=10=] | size=4
     +---+---+---+----+

那么我们假设 "bar" 被读取,所以:

strlength = strlen("bar") = 3

然后 temprealloc() 定为长度 4 + 3 = 7:

      +---+---+---+----+---+---+---+
temp: | f | o | o | [=12=] | ? | ? | ? | 
      +---+---+---+----+---+---+---+

然后 buf 设置为 temp(顺便说一句,这里应该有 NULL-检查)。

最后我们strcpy()"bar"buf + 4 - 1,即buf[3]:

      +---+---+---+---+---+---+----+
 buf: | f | o | o | b | a | r | [=13=] |
      +---+---+---+---+---+---+----+

很明显这个缓冲区和之前的一样大,缓冲区外的字符没有被触及。

        `temp = realloc(str, size + strlength);`

//str的buf被重新分配到length(size+strlength),然后向这个新分配的空间写入更多的字节。初始长度为 1 时,str 的缓冲区在这里是安全的。 但是强烈推荐strcpy,比较安全

在这里,https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm你可以找到一些简单的案例来学习。