用指针给结构体中字符数组赋值问题

拳世界最好855 2015-07-12 10:52:39
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Day
{
int y;
int m;
int d;
};
struct Ren
{
int aa;
char name[20];
struct Day day;
};

int main()
{

struct Ren r1;

struct Ren *p; //定义结构体指针
p = &r1;


p->name[20] = "gggggg";//////这一行有警告
p ->day.y = 1990;
p->aa = 12;


printf("%d\n",p->day.y);
printf("%d\n",p->aa);
printf("%c\n",p->name);
system("pause");
return 0;
}
运行出结果字符串是乱码,求解?
...全文
421 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-07-13
  • 打赏
  • 举报
回复
strcpy(str, "World!");  // 正确但不安全
strncpy(str,"World!",9);str[9]=0;//完全正确
「已注销」 2015-07-13
  • 打赏
  • 举报
回复
要向结构体的 name 赋值,也应该是 p->name 而不是 p->name[20]。首先赋值方式不对,应该是 strcpy,其次 p->name[20] 本身已经越界了,而且类型也不对,把一个字符赋值给一个字符!看看这种写法:

char str[10] = "Hello!";
str[0] = 'h';           // 正确
str[10] = 'H';          // 越界但语法正确
str[10] = "World!";     // 越界且语法不正确,类型不匹配
strcpy(str, "World!");  // 正确
对于结构体成员,写法是一样的,只是前面多了一个 "p." 或 "p->" 而已。如果你连这段代码都会犯错误,只能说明基础不扎实。
lin5161678 2015-07-13
  • 打赏
  • 举报
回复
引用 1 楼 lgbxyz 的回复:
数组不能这么赋值得用memcpy
汗 字符串有专用的 strcpy 或 strncpy 用什么memcpy 自造麻烦?
「已注销」 2015-07-13
  • 打赏
  • 举报
回复
// 字符指针和字符数组的初始化:
char *ps      = "Hello!";
char str[256] = "Hello!";
// 运行时刻重新赋值:
// 对于指针而言,只是改变了指针指向
ps = "World!";
// 对于数组而言,改写内存区域的内容
strcpy(str, "World!");
// 结构体同理:
// 结构体字符指针和字符数组成员的初始化:
typedef struct { const char *p; } STRUCT_A;
typedef struct { char str[256]; } STRUCT_B;
// 指针和数组初始化方式相同:
STRUCT_A st_a = { "Hello!" };
STRUCT_B st_b = { "Hello!" };
// 运行时刻重新赋值(同上):
st_a.p = "World!";
strcpy(st_b.str, "World!");
1987andy 2015-07-13
  • 打赏
  • 举报
回复
字符数组可不支持这种直接字符串赋值的,你应该通过内存copy等方式来实现,或者通过字符串指针给数组直接赋值
LubinLew 2015-07-12
  • 打赏
  • 举报
回复
引用 2 楼 gcx100 的回复:
[quote=引用 1 楼 lgbxyz 的回复:] 数组不能这么赋值得用memcpy
如果是定义的时候可以直接赋值是吧,比如 char str[20] = "ggggggg"[/quote] 你得分清 初始化和赋值
sprawling 2015-07-12
  • 打赏
  • 举报
回复
定义的时候是可以的,但是中间的赋值需要memcpy, 如果你想直接赋值就用MFC中的CString吧。
拳世界最好855 2015-07-12
  • 打赏
  • 举报
回复
引用 1 楼 lgbxyz 的回复:
数组不能这么赋值得用memcpy
如果是定义的时候可以直接赋值是吧,比如 char str[20] = "ggggggg"
LubinLew 2015-07-12
  • 打赏
  • 举报
回复
数组不能这么赋值得用memcpy
内容概要:本文详细介绍了C语言结构体、数组和指针的相关概念与应用实例。首先讲解了结构体变量的定义方法及其相互赋值的风险,接着通过具体代码演示了结构体数组的操作,包括输入、计算平均分和排序。随后深入探讨了结构体嵌套指针的应用,展示了如何创建、初始化、排序和释放结构体指针。此外,文章还详细解释了一维数组和多维数组的初始化、内存布局以及数组指针的概念,并通过示例代码说明了指针数组与数组指针的区别。最后,提供了指针数组查找特定字符串位置及合并排序多个字符串数组的方法。 适合人群:具有一定C语言基础的开发者,特别是对结构体、数组和指针有初步了解的学习者或工作1-3年的程序员。 使用场景及目标:①掌握结构体变量的定义、初始化及操作技巧;②理解一维和多维数组的内存布局及指针操作;③学会使用指针数组和数组指针解决实际问题,如查找和排序字符串数组;④能够编写和调试涉及复杂数据结构的C语言程序。 阅读建议:本文内容较为深入,建议读者在阅读过程结合具体的代码示例进行实践操作,同时注意理解各个概念之间的区别与联系,逐步提升对C语言复杂数据结构的掌握程度。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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