2015-02-23 78 views
1

除了我早先提出的问题Dynamically allocating an array in a function in C ,这个问题已得到解答并且工作正常,如果我的结构字段之一是指针本身,它似乎不起作用。动态分配函数中的内存函数C

这里是我想现在要做的:

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

typedef struct myData { 
    unsigned char* dataBuffer; 
    int lengthInBytes; 
}myData; 


// suppose this is dynamic. it return a value according to some parameter; 
int howManyDataBuffers() { 
    // for this demo assume 5. 
    return 5; 
} 

// this just fills data for testing (the buffer is set with its length as content. exp:3,3,3 or 5,5,5,5,5) 
int fillData(int length, myData* buffer) { 
    buffer->dataBuffer = (unsigned char*)malloc(length); 
    memset(buffer->dataBuffer,length,length); 
    buffer->lengthInBytes = length; 
    return 1; 
} 

int createAnArrayOfData(myData** outArray,int* totalBuffers) { 

    // how many data buffers? 
    int neededDataBuffers = howManyDataBuffers(); 

    // create an array of pointers 
    *outArray =(myData*)malloc(neededDataBuffers * sizeof(myData)); 

    // fill the buffers with some data for testing 
    for (int k=0;k<neededDataBuffers;k++) { 
     fillData(k*10,outArray[k]); 
    } 

    // tell the caller the size of the array 
    *totalBuffers = neededDataBuffers; 

    return 1; 
} 


int main(int argc, const char * argv[]) { 

    printf("Program Started\n"); 

    myData* arrayOfBuffers; 
    int totalBuffers; 
    createAnArrayOfData(&arrayOfBuffers,&totalBuffers); 

    for (int j=0;j<totalBuffers;j++) { 
     printf("buffer #%d has length of %d\n",j,arrayOfBuffers[j].lengthInBytes); 
    } 

    printf("Program Ended\n"); 

    return 0; 
} 

结果是BAD_ACCESS在这一行:

buffer->dataBuffer = (unsigned char*)malloc(length); 

我会感激与寻找我究竟做错了什么帮助。

谢谢。

+4

标准警告:请[不要转换](http://stackoverflow.com/q/605845/2173917)'malloc()'和系列的返回值。 – 2015-02-23 14:49:06

+2

请检查'malloc()' – 2015-02-23 14:51:45

回答

1

问题是,您正在分配一个结构数组,但使用它(通过outArray[k]),就好像它是一个指针数组一样。呼叫

fillData(k*10, &(*outArray)[k]); 

代替

的区别是:

outArray[k] == *(outArray+k)这意味着你解引用在位置outArray + k*sizeof(myData*)字节的地址。但是没有存储在该位置的有效地址。

&(*outArray)[k]首先取消存储在位置outArray的地址,这是malloc()(结构数组的起始地址)返回的地址。那么你可以通过你想要的数组中的第k个结构的地址(如果你愿意,你也可以写(*outArray)+k而不是&(*outArray)[k])。

+0

是否成功谢谢!!!这样可行。 – 2015-02-23 17:58:50

+0

太好了,欢迎您接受答案 – 2015-02-23 18:15:23