我正在尝试创建一个接受预先分配的内存指针作为输入的函数,并使用数据填充该位置的结构数组。在这个例子中,我期望输出为:
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 :(得分:4)
您没有处理正确的类型。只需更改:
void makerec(record** data) {
为:
void makerec(record * data) {
和
makerec(&data);
为:
makerec(data);
以及将data[0]->word='W';
和朋友更改为data[0].word = 'W';
data
已经是一个指针,你想要改变它指向的东西,所以你可以直接将它传递给makerec
。如果您希望data
使其指向不同的内容,您可以将指针传递给makerec()
,但这不是您在此处所做的事情,所以只是通过{ {1}}本身是正确的。
附带您的主要问题,但是:
data
应该是:
record* data=(record*)malloc(sizeof(record)*1000);
注意:
您不需要(而且,在我看来,不应该)投出record* data = malloc(1000 * sizeof *data);
if ( !data ) {
perror("memory allocation failed");
exit(EXIT_FAILURE);
}
和朋友
malloc()
优于sizeof *data
,因为如果sizeof(record)
的类型发生变化,它会继续有效,更重要的是,它会消除您应用{data
的可能性1}}运算符为不正确的类型,这是一个常见的错误。
撤销sizeof
和1000
的位置仅仅是装饰性的,以使多个sizeof *data
更易于理解。
如果分配失败,您应该始终检查'*'
的返回值,并采取适当的措施(例如退出程序)。