我试图理解C语言中的结构基础知识 敬请谅解 这是我的代码: 我在Windows 7上运行代码块
#include<stdio.h>
struct xx
{
int a;
char x[10];
};
int main()
{
struct xx *p;
p->a=77;
p->x[10] = "hello";
printf("\n %d",p->a);
printf("\n %s ",p->x);
return 0;
}
在我尝试打印p-&gt; x的行中 程序崩溃了 ! 第二个问题: 当我不初始化任何结构整数时它们默认为零是真的吗? 如果在结构内部,AND字符串non initialized(char star)默认为null 第三个问题: 我试过将线路改为
p->x= "hello";
即便如此,我也会收到错误!! 我甚至试图改变
char tem[] = "hello";
p->x[]= tem[];
我仍然收到错误
p->x= tem[];
此行也会出错 甚至这个
char *tmp = "hello";
p->x= tem[];
即便如此
char *tmp = "hello";
p->x[]= tem[];
即使这一行也是错误
char *tmp = "hello";
p->x[10]= tem[];
您可以关闭此问题,但请澄清我! 如何初始化结构中的字符数组
答案 0 :(得分:2)
在尝试使用struct
之前,您必须使用malloc()
为struct xx *p = NULL;
p = malloc(sizeof(struct xx));
if (!p) {
fprintf(stderr, "could not allocate memory for pointer p\n");
exit(-1);
}
p->a = 77;
...
free(p); /* do this when you no longer need pointer p */
分配内存:
x
就访问#include <string.h>
...
if (strncpy(p->x, "blahblah", 4))
fprintf(stdout, "p->x: %s\n", p->x); /* p->x: blah */
else {
fprintf(stderr, "could not copy string to p->x\n");
exit(-1);
}
而言,最好复制字符串,例如:
const char *
尽可能尝试使用strncpy()
,因为手动指定字符数有助于强制检查边界的习惯,有助于避免溢出。
例如,让我们尝试将p->x
复制到p->x
,这恰好比#include <assert.h>
#define MAX_LENGTH 10
struct xx {
int a;
char x[MAX_LENGTH];
};
...
const char *foo = "blahblahblah";
assert(strlen(foo) < MAX_LENGTH); /* code should fail here */
if (strncpy(p->x, foo, strlen(foo) + 1))
...
可以容纳的时间长:
assert()
当你运行它时,Assertion failed: (strlen(foo) < MAX_LENGTH), function main, file test.c, line xyz.
Abort trap: 6
应该跳闸:
foo
将\0
缩短为九个或更少的字符(strncpy()
终结符需要第十个字符时,请记住!)代码应该正常运行。
所以使用{{1}}并检查你的界限!
答案 1 :(得分:0)
你的主要问题是指针 p ,它应该指向内存中的结构,并不指向结构。指针 p 只包含随机垃圾,你没有指向它的结构。
解决此问题的最简单方法是创建一个struct变量,让 p 指向它:
struct xx the_actual_struct;
struct xx *p = &the_actual_struct;
此外,您不能使用正常赋值运算符 = 为结构中的字符串 x 指定字符串。您需要使用 strcpy :
strcpy(p->x, "hello");
答案 2 :(得分:0)
你有几个问题;
1)您将指向结构的指针与结构的实际“实例”混淆。 p是一个指针,但它没有指向任何东西,你需要做一个
p = malloc(sizeof(struct xx));
在声明它使其指向实际分配的内存之后的行上。完成使用后,您应该在该内存上使用free()
。
另一种方法是将p设为实际结构而不是指针,将其更改为
struct xx p;
(注意缺少的*)将使p成为一个实际的结构,并使用p.x(结构访问)而不是p-&gt; x(指针访问)来访问成员。它(与你用malloc分配的内存相比)也是为你的函数本地分配的,并且当你的函数存在时它会在超出范围时自动“消失”。
此外,C中的字符串也是指针,因此为某些内容指定“hello”不会自动复制字符串。您需要使用strcpy(p->x, "hello");
将数据复制到char数组。
最后,不,几乎没有任何东西会在C中自动归零。假设您必须初始化所有内容并且您将是安全的,并且不必记住自动完成的操作而不是。