通过字符串结构引用

时间:2012-02-04 07:37:40

标签: c arrays pointers structure

我试图理解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[];

您可以关闭此问题,但请澄清我! 如何初始化结构中的字符数组

3 个答案:

答案 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中自动归零。假设您必须初始化所有内容并且您将是安全的,并且不必记住自动完成的操作而不是。