不确定 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
然后 temp
将 realloc()
定为长度 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你可以找到一些简单的案例来学习。
我是 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
然后 temp
将 realloc()
定为长度 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你可以找到一些简单的案例来学习。