看似简单的C语言二级指针怎么那么难-第二季?? 400 报错
我根据上一个提问, 写了另外一个测试程序, 也出错了, 为什么呢?
奇怪, 编译通过, 但同样是出现了上次的segmant fault错误!!!!
struct data {
int sh;
};
struct data test[2];
void change(struct data **d)
{
int i = 0;
struct data *p = NULL;
for (i = 0; i < 2; i++) {
printf("step %d\n", i);
p = d[i];
p->sh = 2;
}
}
int main(void)
{
test[0].sh = 1;
test[1].sh = 1;
change(&test);
printf("%d %d\n", test[0].sh, test[1].sh);
return 0;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
d 是个数组, 楼主看错了吧,哪来的二维
struct data { int sh; };
struct data test[2];
void change(struct data d[]) { int i = 0; struct data p=NULL; //p=(struct data)malloc(sizeof(struct data));
for (i = 0; i < 2; i++) {
printf("step %d\n", i);
p=&d[i];
p->sh=2;
}
}
int main(void) { test[0].sh = 1; test[1].sh = 1;
change(&test);
printf("%d %d\n", test[0].sh, test[1].sh);
return 0;
}
这样也可以:
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
struct data {
int sh;
};
struct data test[2];
void change(struct data *d)
{
int i = 0;
//struct data *p=NULL;
//p=(struct data*)malloc(sizeof(struct data));
for (i = 0; i < 2; i++) {
printf("step %d\n", i);
(d+i)->sh=2;
}
}
这个是二维数组,二维数组在作为入参时需要传入第二维维度的,也就说void change(struct data (*d)[2])
######方法1 :void change(struct data *d);声明函数, 调用change(test)就可以, 而方法2: void change(struct data **d), 调用change(&test)就不行? 还是不太理解!######是滴,看错了。。应该是数组指针######楼主看错了吧,哪来的二维数组。。。######好久没看这样的问题了,"数组名"我一直理解成一个常量指针,在这段代码里是一个一级的常量指针,定义的时候就系统就已经在静态存储区为它分配好了内存,它自己在内存中的地址和指向的地址都一样,这个指针的指向不能改变。这种情况下,我很少用数组指针去实现(基本没用过),直接传一级指针就好了, void change(struct data *d), 调用的时候用 change(test); ######哦哦, 你是说, struct data test[2] 当中的test是一个一级常量指针, 这个test指针的指向不能改变? 我只是想改变它指向某个地址的值而已哦, 也就是说, 我只想改变test[x],这样做不允许??? 为什么你传一级指针就可以, 而我传二级指针就不行呢void change(struct data **d) ???######方法1 :void change(struct data *d);声明函数, 调用change(test)就可以,
而方法2: void change(struct data **d), 调用change(&test)就不行? 还是不太理解!能否详尽解释一下???
######首先下标运算的含义,type a[b],a[c],是*((void*)a c*sizeof(type))######你的意思应该是这样,*((void *)a + c * sizeof(type)), 对吗?######看不懂, 请说详细一点,######你想你这样正确,传入值应该是一个由指向data对象的指针构成的数组,而不是data数组取地址,尽管语法上编译器检查不出错误######a c中间是加号,wp客户端似乎打不出来###### (*d)[i]->sh = 2######先生, 不对哦######(*d)[i].sh=2