gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:33 24 4
gpt4 key购买 nike

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

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 | \0 | size=4
+---+---+---+----+

然后让我们假设 "bar" 被读取,这样:

strlength = strlen("bar") = 3

然后 temp 将被 realloc() 设置为长度 4 + 3 = 7:

      +---+---+---+----+---+---+---+
temp: | f | o | o | \0 | ? | ? | ? |
+---+---+---+----+---+---+---+

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

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

      +---+---+---+---+---+---+----+
buf: | f | o | o | b | a | r | \0 |
+---+---+---+---+---+---+----+

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

关于c - 不确定 strcpy 在这种情况下如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44587352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com