从函数返回的自由数组

时间:2017-09-20 17:36:06

标签: c arrays malloc free

如果这出现在其他地方,我很抱歉,我找不到明确的答案。 我一直在使用Ed S的答案,选项1(下面链接)来分配内存,填充数组,然后将其返回给调用者。 他建议你在完成内存后释放内存,但是当我添加free()行时,我得到一个核心转储。 我曾经和GDB讨论过,但我的技能可能不是必需的。

提前感谢您提供任何帮助。

链接回答:Returning an array using C

代码:

#include <stdio.h>
#include <stdlib.h>

char * createArray();

int main(int argc, char *argv[]){
    printf("Creating Array...\n");
    // pointer to an int
    char *p;
    // size of the array
    int i,j;
    // width of array
    int width = 7;
    // height of array
    int height = 5;
    // get an array from the function
    p = createArray(width, height);
    // check if p was created properly
    if (p){
        // print out the array
        for (i = 0; i < width; ++i){
            for (j = 0; j < height; ++j){
                printf("[%c] ", *(p + (i * width) + j)); 
            }
        printf("\n");
        }

        // here's where it hits the fan
        free(p);
    }
    return 0;
}

char * createArray(int w, int h){
    // allocate some memory for the array
    char *r = malloc(w * h * sizeof(char));
    // check if the memory allocation was successful
    if(!r){
        return NULL;
    }
    int i, j;
    int count = 0;
    for (i = 0; i < w; ++i){
        for (j = 0; j < h; ++j){
            *(r + (i * w) + j) = 'X';
            ++count;
        }
    }
    return r;
}

2 个答案:

答案 0 :(得分:2)

有了这个

char *r = malloc(w * h * sizeof(char));

您分配w * h(7 * 5 = 35个字节)的内存。但

        *(r + (i * w) + j) = 'X';

可以访问超出您已分配的35个字节(您将查看是否在循环中测试i * w + j的可能值),从而导致未定义的行为。

这可能会覆盖malloc的内部数据结构,因此当你free()时碰巧会遇到核心转储。

答案 1 :(得分:1)

你在这些方面犯了错误

  

*(r + (i * w) + j) = 'X';

  

printf("[%c] ", *(p + (i * width) + j));

保持在&#34; 2D&#34;的范围内。 array -it是一维的,但你正在解决它,就像编译器那样 - 它应该是i * length

*(r + (i * h) + j) = 'X';`

printf("[%c] ", *(p + (i * height) + j)); `

如果你使用它,你应该能够保持在界限内而不会弄得一团糟。