我是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);
}
真的只是想确保我不会在未来遇到问题。
答案 0 :(得分:2)
是的,只要vuejs-datepicker
确保缓冲区足够大(确实如此),这是安全的。
在您realloc()
之前:
realloc()
然后让我们假设 +---+---+---+----+
buf: | f | o | o | \0 | size=4
+---+---+---+----+
被读取,以便:
"bar"
然后strlength = strlen("bar") = 3
将为temp
长度为4 + 3 = 7:
realloc()
然后 +---+---+---+----+---+---+---+
temp: | f | o | o | \0 | ? | ? | ? |
+---+---+---+----+---+---+---+
设置为buf
(应该temp
- 检查此处,顺便说一句。)
最后我们NULL
strcpy()
改为"bar"
,即buf + 4 - 1
:
buf[3]
显然,此缓冲区与之前的大小相同,并且未触及缓冲区外的任何字符。
答案 1 :(得分:0)
$Topic::hydrate($result);
//将buf的str重新分配给length(size + strlength),然后将更多的字节写入这个新分配的字节。初始长度为1,str的缓冲区在这里是安全的。 但是,强烈建议使用strcpy,这样更安全。
在这里,https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm你可以找到一些简单的研究案例。