在Realloc中获取分段错误

时间:2012-01-30 15:05:29

标签: c

这里我想创建动态内存。 这里我不知道输出大小,我想在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);

}

3 个答案:

答案 0 :(得分:11)

有两个主要问题:

  1. realloc() 返回新地址:

    new_results = realloc(results, ...);
    if (new_results != NULL) {
      results = new_results;
    } else {
      /* handle reallocation failure, `results' is still valid */
    }
    
  2. sizeof()不是找出resultsbuffer大小的正确方法。它只会返回指针的大小。对于results,您可能希望自己跟踪分配的大小。对于buffer,您可能正在寻找strlen()

  3. 修复上述内容后,您需要确保results最终为有效的NUL终止字符串。这是printf()正常工作所必需的。

答案 1 :(得分:2)

你的代码只是盲目地向前推进,看似根据“它编译,它必须工作”范式编写。如果听起来很苛刻,我很抱歉,当然不是对你个人的评论。

你需要在API的文档中:你正在尝试使用它,并分析你的用法是否有意义。

您不能忽略realloc()的返回值,您将如何获得新分配的内存?它不能改变你现有的指针,因为你是按值传递的。

动态数组通常需要工作的方式是跟踪三件事:

  • 当前数组的基地址
  • 现在数组保存的元素数(字节数)
  • 数组可容纳的元素数量,最大值(在需要增长之前)

当附加 n 新元素时,检查是否这样做会溢出元素数量,因此它会大于最大值。这是不允许的,因此在这种情况下,您需要重新分配基础数组,以便新数据适合,并且(当然)相应地更新数组的状态。

答案 2 :(得分:1)

  

realloc(结果,sizeof(结果)+ sizeof(缓冲区));

这一行可能是问题所在。

  1. realloc()返回使用指定大小分配的新地址,并且无法保证它与指针之前的地址相同;所以,你应该总是重新分配你的指针:

    ptr = realloc(ptr,newSize);

  2. sizeof()不会返回指针的动态分配大小。在这种情况下,sizeof(results)sizeof(buffer)最有可能总是返回8.您可以替换为:

    results = realloc(results,ctr * 514);
    其中ctr是short,在while之前用0初始化并计算迭代次数。

  3. 由于缓冲区始终为514,为什么不通过将其重新分配到以下来减少负载:

    char buffer [514];

    最诚挚的问候