字符串的疑问

AAA20090987 2010-09-17 04:05:01
在linux的代码中,常常看见像char d_name[1]这样的声明,这种字符串不是只能存诸'\0'吗?
那么他应该怎么使用呢?这样写有什么好处?
如果要动态分配内存的话,直接用 char *d_name 这样不是更好吗?

这个问题,我百思不得其解,只好请大家帮忙了。
...全文
70 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAA20090987 2010-09-17
  • 打赏
  • 举报
回复
明白了,谢谢大家
guoxuqu 2010-09-17
  • 打赏
  • 举报
回复
学习了。
justkk 2010-09-17
  • 打赏
  • 举报
回复
考虑一下System V的消息队列。
struct mbuf
{
mtyp_t mtype; /* 消息类型 */
unsigned char *mtext; /* 消息内容 */
};
这种方式不能实现变长消息队列。

消息队列存储时,首先是mtyp_t类型的“消息类型”,消息内容紧跟其后,消息类型与内容依次存放在连续的内存单元。
如果把mtext定义为指针,即使给它分配了空间,程序并不会以期望的方式运转。
消息内容不是存放在mtext指向的内存单元,而是把指针mtext本身的地址作为起始地址,依次往后顺序存放,这就会覆盖其它变量的内存空间,从而造成程序的崩溃。

应该采用data[1]的定义方式,及空间分配方式。
谭海燕 2010-09-17
  • 打赏
  • 举报
回复
char d_name[1]

char d_name[0]的用法有点类似
justkk 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 aaa20090987 的回复:]当我想对这个字符串赋值的时候,应该怎么做呢?[/Quote]
直接赋值就可以,只要不超出buff的空间
strcpy(p->data, "long message");
wwwunix 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aaa20090987 的回复:]

引用 1 楼 wwwunix 的回复:
d_name不只能存储'\0',前面还可以有一个字符。
运行一下下面的代码就知道了

C/C++ code

int main() {
char a[1];
strcpy(a,"a");
printf("a=[%s]\n",a);
}


谢谢你啊
再问一下:为什么会这样的呢?内存又是什么时候分配的呢?
[/Quote]
我的这个程序,内存在编译的时候就分配好了。程序一加载就自动分配出来了。
AAA20090987 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justkk 的回复:]
这种定义通常用于可变长度的消息
struct A
{
int len;
char data[1];
} *p;

char buff[1024];
p = (A *)buff;

实际的长度通过p->len控制。

如果把data定义为指针,并动态分配内存,那么它指向的空间和len在内存中是不连续的。
[/Quote]

谢谢
当我想对这个字符串赋值的时候,应该怎么做呢?
AAA20090987 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwunix 的回复:]
d_name不只能存储'\0',前面还可以有一个字符。
运行一下下面的代码就知道了

C/C++ code

int main() {
char a[1];
strcpy(a,"a");
printf("a=[%s]\n",a);
}
[/Quote]

谢谢你啊
再问一下:为什么会这样的呢?内存又是什么时候分配的呢?
justkk 2010-09-17
  • 打赏
  • 举报
回复
这种定义通常用于可变长度的消息
struct A
{
int len;
char data[1];
} *p;

char buff[1024];
p = (A *)buff;

实际的长度通过p->len控制。

如果把data定义为指针,并动态分配内存,那么它指向的空间和len在内存中是不连续的。
wwwunix 2010-09-17
  • 打赏
  • 举报
回复
d_name不只能存储'\0',前面还可以有一个字符。
运行一下下面的代码就知道了

int main() {
char a[1];
strcpy(a,"a");
printf("a=[%s]\n",a);
}

23,222

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧