c语言字符串可以取地址吗,关于字符串地址的有关问题

本文讨论了在C语言中初始化字符串数组时遇到的问题,特别是如何正确地为字符数组分配空间并确保字符串正确终止,避免数组越界导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于字符串地址的问题

大家好,我在初始化字符串数组时遇到这么一个问题。

首先,我定义了一个结构体

struct buffer{

// ....

char packet_head_1[4];

char packet_head_2[4];

} ;

然后是初始化函数

int Init(struct buffer *Buf, char *head_ptr_1, char *head_ptr_2)

{

int i;

for (i = 0; i 

Buf->packet_head_1[i] = *(head_ptr_1 + i);

Buf->packet_head_2[i] = *(head_ptr_2 + i);

}

}

然后在main中调用Init

//.....

struct buffer test_buf

Init(&test_buf, "$ABC", "$DEF")

我的本意,是把"$ABC"分配给Buf->packet_head_1,把"$DEF"分配给Buf->packet_head_2,但是在C++6.0中断点调试,发现Buf->packet_head_1的实际值是"$ABC$DEF \"(最后面还跟了个\号),而Buf->packet_head_2的值正常,为"$DEF \",我想因为地址是连续的,所以Buf->packet_head_1也就访问了Buf->packet_head_2的区间,但是现在我不想让他这么做,请问大家我有什么办法吗?另外最后面的那个"\"号是什么呢?如果是"\0",在C++6.0是显示一个空位啊。

------解决方案--------------------

char packet_head_1[4];

----->

char packet_head_1[5];

字符数组如果要当做字符串来使用, 其长度 应该 比 字符的个数多一个。

比把多余的哪一个设置为0x00 也就是\0

这是字符串的结束标识符,

C语言是考这个来定位 字符串结束的地方。

------解决方案--------------------

引用:Quote: 引用:char packet_head_1[4];

----->

char packet_head_1[5];

字符数组如果要当做字符串来使用, 其长度 应该 比 字符的个数多一个。

比把多余的哪一个设置为0x00 也就是\0

这是字符串的结束标识符,

C语言是考这个来定位 字符串结束的地方。

谢谢relaxisland,我试过把长度增加为20,但是Buf->packet_head_1最后得到的值到最后还是"$ABC????????????$DEF\",而我后面的程序是想用strcmp()比较一个temp[4]和Buf->packet_head_1的值,这样的话即使temp[4]内的值是"$ABC",但是用strcmp()还是会得到两者不同的结果。

应该在你想结束的地方 设置为 0 啊

或者字符数组赋值前,把所有的的元素 初期化为 0x00

------解决方案--------------------

引用:Quote: 引用:char packet_head_1[4];

----->

char packet_head_1[5];

字符数组如果要当做字符串来使用, 其长度 应该 比 字符的个数多一个。

比把多余的哪一个设置为0x00 也就是\0

这是字符串的结束标识符,

C语言是考这个来定位 字符串结束的地方。

谢谢relaxisland,我试过把长度增加为20,但是Buf->packet_head_1最后得到的值到最后还是"$ABC????????????$DEF\",而我后面的程序是想用strcmp()比较一个temp[4]和Buf->packet_head_1的值,这样的话即使temp[4]内的值是"$ABC",但是用strcmp()还是会得到两者不同的结果。

int Init(struct buffer *Buf, char *head_ptr_1, char *head_ptr_2)

{

int i;

for (i = 0; i 

Buf->packet_head_1[i] = *(head_ptr_1 + i);

Buf->packet_head_2[i] = *(head_ptr_2 + i);

}

Buf->packet_head_1[4] = ‘\0’;

Buf->packet_head_2[4] = ‘\0’;

}

------解决方案--------------------

int Init(struct buffer *Buf, char *head_ptr_1, char *head_ptr_2)

{

memset(Buf->packet_head_1, 0, sizeof(Buf->packet_head_1) );

memset(Buf->packet_head_2, 0, sizeof(Buf->packet_head_2) );

strcpy(Buf->packet_head_1, head_ptr_1);

strcpy(Buf->packet_head_2, head_ptr_2);

}

strcpy的时候注意数组越界

------解决方案--------------------

数组访问越界

------解决方案--------------------

“多一少一”问题占程序员常犯错误的10%以上!

避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,搬手指头心算验证一下程序到底应该写为

x、x-1、x+1中的哪个?

、>=中的哪个?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值