2016-04-01 118 views
3

我试图做一个函数,接受一个预先分配的内存指针作为输入,并用该数据填充该位置的结构数组。在这个例子中,我期望的输出为:填充函数内动态分配的结构

W 100 
L 200 

然而,第一线是正确的,但第二行打印没有字符和一个零。我究竟做错了什么?

typedef struct{ 
    char word; 
    long number; 
}record; 

void makerec(record** data){ 
    data[0]->word='W'; 
    data[0]->number=100; 
    data[1]->word='L'; 
    data[1]->number=200; 
} 

int main(){ 
    record* data=(record*)malloc(sizeof(record)*1000); 
    makerec(&data); 
    printf("%c %ld\n",data[0].word,data[0].number); 
    printf("%c %ld\n",data[1].word,data[1].number); 
    free(data); 
    return 0; 
} 
+0

'data [1]'访问超出界限。你的意思是'(* data)[1] .word ='L';'等等 –

回答

4

你没有处理正确的类型。简单地改变:

void makerec(record** data) { 

到:

void makerec(record * data) { 

和:

makerec(&data); 

到:

makerec(data); 

以及改变data[0]->word='W';和朋友data[0].word = 'W';

data已经是一个指针,你想改变它指向的东西,所以你可以直接将它传递给makerec。如果你想让makerec()指向一些不同的东西,你会传递一个指向data的指针,但这不是你在这里做的,所以只要通过data本身就是正确的。

附带您的主要问题,但:

record* data=(record*)malloc(sizeof(record)*1000); 

应该是:

record* data = malloc(1000 * sizeof *data); 
if (!data) { 
    perror("memory allocation failed"); 
    exit(EXIT_FAILURE); 
} 

注:

  1. 你并不需要(而且,我的脑海里,不应该)施放返回值malloc()和朋友

  2. sizeof *datasizeof(record)更好,因为如果data类型发生变化,它将继续工作,更重要的是,它可以消除将sizeof运算符应用于错误类型的可能性,这是一种常见错误。

  3. 扭转1000sizeof *data的位置仅仅是一种美化,使多个'*'更容易理解。

  4. 如果分配失败,您应该始终检查malloc()的返回值,并采取适当的措施(如退出程序)。