我不确定我是否具体而且清晰。 但不清楚怀疑。 我正在尝试为指针分配NULL值。
给出代码:
typedef struct Date
{
int year;
int month;
}Date;
typedef struct Record
{
char name[20];
char cdate[20];
float quanitity;
int barcode;
Date date;
}Record;
然后在main:
Record *records = malloc(10 * sizeof(Record));
records[0] = NULL;
当我定义一个premitive类型的similliar数组时,这是行不通的,例如int 我可以分配值,或NULL 例如
int *avi = malloc(sizeof(int)*10);
avi[0] = 3;
avi [0] = NULL;
它工作正常,我打印了价值并看到了变化。 但是,当我对结构的指针数组执行相同操作时,如上所述 我只是不能指定一个NULL值..
无能。 我正在使用eclipse IDE。 提前谢谢。
答案 0 :(得分:1)
您的问题是records
是指向10个对象的指针。因此,records[0]
是第一个对象。您无法将对象设置为NULL
。
它似乎仅适用于int
,因为您将int
设置为零,而不是NULL
。
答案 1 :(得分:0)
NULL是一个内置常量,其值为0.这就是为什么你可以将它分配给原始类型,如int和char。它适用于指针,因为C语言的特定结构告诉编译器“0”表示“指向无效的内存地址”,这可能不是实际值“0”。
您对结构类型的NULL赋值不起作用,因为您无法将结构设置为整数类型。
答案 2 :(得分:0)
这里是创建指向Record结构的指针数组的示例。因为数组包含指向Record结构的指针,而不是直接包含Record结构,所以可以将指针设置为NULL-如果数组直接包含Record结构,则无法执行此操作。
#include <stdlib.h>
typedef struct Date
{
int year;
int month;
}Date;
typedef struct Record
{
char name[20];
char cdate[20];
float quanitity;
int barcode;
Date date;
}Record;
int main()
{
// We start by creating an array of 10 Record pointers.
// records is a pointer to the array we create
Record **records = malloc(10 * sizeof(Record*));
// First thing is first - did it work?
// There is no point in doing anything else if the array didn't get created
if (records != NULL) {
// The Record pointers are uninitialized
// Arrays don't do that automatically
// So we need to initialize all the pointers
// in this case we set them all to NULL
for (int i=0;i<10;i++)
records[i] = NULL;
// Later on in the program we might want to
// create one Record structure and assign it to records[5]
records[5] = malloc(sizeof(Record));
// Again, we need to check if the Record structure got created
if (records[5] != NULL) {
// Do something with this Record structure
// Fill it in, print it out, etc.
}
// Then at the end of the program
// we want to deallocate all the Record structures we created
for (int i=0;i<10;i++)
if (records[i] != NULL)
free(records[i]);
// And finally we need to deallocate the array of pointers
free(records);
}
return 0;
}