这里我想创建动态内存。 这里我不知道输出大小,我想在while循环后打印最后的最终输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
char *sdpCommand = "sdptool browse 04:18:0F:B1:48:B5";
FILE *fp;
fp = popen(sdpCommand, "r");
char *results = 0;
if (fp == NULL) {
printf("Failed to run command\n");
return;
}
char* buffer = malloc(514);
while (fgets(buffer, strlen(buffer) - 1, fp) != NULL) {
realloc(results, strlen(results) + strlen(buffer));
memcpy(results + strlen(results), buffer, strlen(buffer));
}
printf("Output ::: %s", results);
/* close */
pclose(fp);
sleep(1);
}
答案 0 :(得分:11)
有两个主要问题:
realloc()
返回新地址:
new_results = realloc(results, ...);
if (new_results != NULL) {
results = new_results;
} else {
/* handle reallocation failure, `results' is still valid */
}
sizeof()
不是找出results
和buffer
大小的正确方法。它只会返回指针的大小。对于results
,您可能希望自己跟踪分配的大小。对于buffer
,您可能正在寻找strlen()
。
修复上述内容后,您需要确保results
最终为有效的NUL终止字符串。这是printf()
正常工作所必需的。
答案 1 :(得分:2)
你的代码只是盲目地向前推进,看似根据“它编译,它必须工作”范式编写。如果听起来很苛刻,我很抱歉,当然不是对你个人的评论。
你需要在API的文档中看:你正在尝试使用它,并分析你的用法是否有意义。
您不能忽略realloc()
的返回值,您将如何获得新分配的内存?它不能改变你现有的指针,因为你是按值传递的。
动态数组通常需要工作的方式是跟踪三件事:
当附加 n 新元素时,检查是否这样做会溢出元素数量,因此它会大于最大值。这是不允许的,因此在这种情况下,您需要重新分配基础数组,以便新数据适合,并且(当然)相应地更新数组的状态。
答案 2 :(得分:1)
realloc(结果,sizeof(结果)+ sizeof(缓冲区));
这一行可能是问题所在。
realloc()
返回使用指定大小分配的新地址,并且无法保证它与指针之前的地址相同;所以,你应该总是重新分配你的指针:
ptr = realloc(ptr,newSize);
sizeof()
不会返回指针的动态分配大小。在这种情况下,sizeof(results)
和sizeof(buffer)
最有可能总是返回8.您可以替换为:
results = realloc(results,ctr * 514);
其中ctr是short
,在while
之前用0初始化并计算迭代次数。
由于缓冲区始终为514,为什么不通过将其重新分配到以下来减少负载:
char buffer [514];
最诚挚的问候