嗨,我遇到了这种情况。我使用malloc给我一个由10个指针组成的数组。当我在gdb中看到测试指针时,其中一个(第三个)指向0x0。有时,当使用apple[2]->string="hello"时,代码会出错。malloc为什么这么做?提前感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
typedef struct test
{
char *string;
int data;
} test;
test *apple[10]; // Declare an array of 10 test pointers. This line results in one of the pointers having a null value.
apple[0] = malloc(sizeof(test));
apple[0]->string = "hello";
printf("The string is %sn",apple[0]->string);
printf("Size of apple[0]->data is %dn",sizeof(apple[0]->data));
printf("Size of tester is %dn",sizeof(test));
free(apple[0]);
return 0;
}
我想看看指针数组是如何工作的。我并没有打算用掉所有的10分球。那么我只需要malloc我需要的东西吗?第三个指针是0x0,这是巧合吗?
内存只分配给apple
中的第一个元素,因此只有apple[0]
指向有效的struct test
。
为apple
的所有元素分配内存:
for (int i = 0; i < sizeof(apple) / sizeof(test*); i++)
{
apple[i] = malloc(sizeof(test));
}
free()
需要类似的循环。
test.string
是char*
,所以像您所做的那样指向字符串文字是可以的(尽管类型应该是const char*
)。如果要将字符串复制到test.string
,则必须先将malloc()
空间复制到中,然后再将其复制到free()
中。
根据您的最终目标,有不同的方法。
如果每次运行程序时,数组中的元素数量都是恒定的,那么根本不必使用指针:
test apple[10]; // array with 10 instances of test
test[0].string = ...;
test[1].data = ...;
如果你想使用你的方法(使用指针,现在还没有必要),你必须对每个元素进行malloc()操作(就像你对apple[0]
所做的那样,或者对整个数组进行malloc:
int num = 10;
test *apple = malloc(sizeof(test) * num);
// access any element here
apple[5].string = "hello!";
free(apple);
您只分配了test
的一个实例,并将其分配给第一个数组元素:
apple[0] = malloc(sizeof(test));
要分配全部十个,您需要执行以下操作:
for (int i = 0; i < 10; i++) {
apple[i] = malloc(sizeof(test));
}