c - 在 for 循环中重新分配

标签 c

我正在尝试创建一个函数,该函数应将所有参数作为串联的 char 数组返回。不幸的是,我在使用该函数时遇到“无效指针”错误。我是 C 的新手,所以我以这种方式使用 realloc 可能是错误的。

char* concat(int argc, ...) {
    char* result;

    va_list args;
    va_start(args, argc);

    int i;
    for (i = 0; i < argc; i++) {
        char* s = va_arg(args, char*);
        int length = (result) ? strlen(result) : 1;

        char* tmp = (char*)realloc(result, sizeof(char) * (strlen(s) + length - 1));
        if (tmp == NULL) {
            throw_error("Realloc failed in `concat`.");
        }

        result = tmp;
        memcpy(&(result[length-1]), s, strlen(s));

        printf("result: %s\n", s);
    }

    va_end(args);
    return result;
}

如果有帮助,错误信息:

*** glibc detected *** ./pascc: realloc(): invalid pointer: 0x00000000006060c8 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x76bb6)[0x7f9953be8bb6]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x338)[0x7f9953beed58]
./pascc[0x401368]
./pascc[0x400f85]
./pascc[0x4019bb]
./pascc[0x403c49]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff)[0x7f9953b90eff]
./pascc[0x400e29]
======= Memory map: ========
00400000-00406000 r-xp 00000000 08:05 2885504 

为了避免内存泄漏,我在另一个线程中读到我不应该像这样重新分配一些东西:

result = (char*)realloc(result, sizeof(char) * (strlen(s) + length - 1));

所以我正在尝试找到执行此操作的好方法。一些帮助将不胜感激。

最佳答案

您正在重新分配未初始化的指针。

char* result;

要使用 realloc,您必须使用 NULL 指针或指向由 malloc 分配的内存的指针。

char* result = NULL;

关于c - 在 for 循环中重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8369854/

相关文章:

c - 如何从Linux内核中的当前线程获取父线程名称

c++ - 使用 C/C++ 打开实时媒体流

c - 为什么我需要按两次 Ctrl-D 来标记文件结束?

c - Eclipse CDT/CSFML,加载共享库时出错

c - 为什么 getchar() 不起作用,但 getchar_unlocked() 在读取字符串字符时在 main 函数之外执行?

c - C中的随机数生成器游戏

c - 错误: ‘node’ undeclared (first use in this function)

c++ - 调用函数传递数组

c - 动态分配——内存管理

c - OpenGL 多线程比使用单线程慢