linux下柔性数组,C/C++柔性数组成员

柔性数组成员

定义和声明分离

#include

//只是告诉编译器,当编译到使用到这个函数的的代码时,虽然还没有找到函数定义的实体,但是也让它编译不出错误。

extern int fun(int a);

extern int x;

int x;

int main(){

//在这行调用fun函数,但是编译器只找到了声明,没有找到fun的定义,所以编译不出错误,编译器在后面找到了fun函数的定义实体,所以运行没有问题。

fun(10);

//在这行使用全局变量x,但是编译器只找到了声明,没有找到x的定义,所以编译不出错误,编译器在后面找到了全局变量x的定义实体,所以运行没有问题。

x = 22;

}

int fun(int b){

printf("b = %d\n",b);

return b;

}

运行结果:

b = 22

结构体里有指向字符串指针

结构体里如果有指向字符串指针,就会发生字符串在结构体的外面,不能有结构体来统一管理。

#include

struct Test{

int a;

long b;

char* c;

};

int main(){

//结构体里如果有指向字符串指针,就会发生字符串在结构体的外面,不能有结构体来统一管理。

char *str = "asd";

struct Test t;

t.c = str;

printf("%s\n", t.c);

}

解决办法:

#include

#include

#include

typedef struct Test{

int a;

long b;

} Test;

int main(){

char* str = "i am out of struct Test";

//sizeof(Test)结构体需要字节数,strlen(str)是str需要的字节数,最后的加1是'\0'。这样一来,就相当于只用指针tp,就既可以控制结构体里面的成员,也可以控制结构体外面的字符串。

Test* tp =  (Test*) malloc(sizeof(Test) + strlen(str) + 1);

tp->a = 10;

tp->b = 11;

strcpy((char*)(tp+1), str);

printf("%s\n", (char*)(tp+1));

free(tp);

}

上面的代码有个弊端,就是访问哪个str时,需要使用不容易理解的tp+1,改进如下。

#include

typedef struct Test{

int a;

long b;

char pc[0];

}Test;

int main(){

int a;

long b;

long c;

//不管Test t放在哪行,都能正确访问t.pc

Test t;

long dd;

char str[] = "Hello c Hello c++!";

long ee;

//非常的神奇,虽然没有对t.pc赋值,但是打印出了正确的数据。

printf("%s\n",t.pc);//Hello c Hello c++!

}

为什么,虽然没有对t.pc赋值,但是打印出了正确的数据呢?

方法里声明的局部成员,存放在栈区,编译器把数组str放到了,Test t的下面,而且Test的成员pc还是0空间的数组,也就是不占用内存空间,所以pc内存地址正好和str的内存地址相同了,所以即使不对t.pc赋值,也能正确打印出Hello c Hello c++!。

疑问,为什么不管Test t和char str[] = "Hello c Hello c++!";定义在哪里,编译器都能把str放到Test t的下面。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值