ZPS*_*ZPS 5 c arrays pointers return data-structures
typedef struct unit_class_struct {
char *name;
} person;
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array->name = strdup("Robert");
array++;
array->name = strdup("Jose");
return array;
}
int main()
{
person *array;
array = setName();
printf("First name is %s\n", array[0].name);
printf("Second name is %s\n", array[1].name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,array [0] .name返回Jose,而不是我预期的Robert,而array [1] .name是空的.
但是,如果我使用
person * setName() {
person * array;
person * array_switch;
array = malloc (2 * sizeof(person));
array_switch = array;
array_switch->name = strdup("Robert");
array_switch++;
array_switch->name = strdup("Jose");
return array;
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作.array.name [0]返回Robert,array.name [1]返回Jose.
为什么它需要第二个指针才能使用此示例?我可以不使用第二个指针而继续使用指针算法吗?
我已经知道这是另一种方法:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array[0].name = strdup("Robert");
array[1].name = strdup("Jose");
return array;
}
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 18
在你的代码中:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array->name = strdup("Robert");
array++;
array->name = strdup("Jose");
return array;
}
Run Code Online (Sandbox Code Playgroud)
你为数组中的两个元素分配空间并设置array为指向第一个元素:
+-------+ +----------+
| array | ---> | array[0] |
+-------+ +----------+
| array[1] |
+----------+
Run Code Online (Sandbox Code Playgroud)
然后用元素指针递增array++,这就是最后返回到调用函数的内容.该指针指向第二个数组元素,这就是为什么它似乎是错误的(为什么你几乎肯定会崩溃,当你试图稍后释放该内存时):
+-------+ +----------+
| array | -+ | array[0] |
+-------+ | +----------+
+-> | array[1] |
+----------+
Run Code Online (Sandbox Code Playgroud)
你需要的是:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array[0].name = strdup("Robert");
array[1].name = strdup("Jose");
return array;
}
Run Code Online (Sandbox Code Playgroud)
正如你已经指出的那样.此解决方案根本不会更改array指针.但是,如果你真的想使用指针,你可以在返回之前反转array++with 的动作,array--以便将array其设置回正确的值:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array->name = strdup("Robert");
array++;
array->name = strdup("Jose");
array--;
return array;
}
Run Code Online (Sandbox Code Playgroud)
或者,另一种不改变原始指针的方法,不使用数组索引而不使用第二个指针就是使用指针算法.编译器知道指针指向的是什么类型,因此可以正确调整指针以找到下一个元素(您已经知道它知道如何执行此操作,因为它array++是简写,array = array + 1并且该语句也调整了正确的值):
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
(array+0)->name = strdup("Robert");
(array+1)->name = strdup("Jose");
return array;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14261 次 |
| 最近记录: |