C 无法从结构内部的字符数组中检索数据

C 无法从结构内部的字符数组中检索数据,c,C,我在一个文件中使用以下代码 文件1 //structure is global struct abc { char var; char *a[5]; }*p; struct abc q; int main() { char t[] = "sample" p = &q; p->a[0] = &t[0]; p->var = 10; printf("var = %d, string = %s\n", p->

我在一个文件中使用以下代码

文件1

//structure is global 
struct abc
{
    char var;
    char *a[5];
}*p;
struct abc q;

int main()
{
    char t[] = "sample"
    p = &q;
    p->a[0] = &t[0];
    p->var = 10;
    printf("var = %d, string  = %s\n", p->var, p->a[0]);
    func();
    exit(0);
}
但是,如果我试图访问func中另一个文件中的结构成员a[],则无法获取上面另一个文件中分配的数据

文件2


程序在执行第二个printf时崩溃,但我可以打印在其他文件中分配的p->var的内容。

下面的内容是您需要的

包含文件

prompt> cat foo.h
struct abc {
    char var;
    char *a[5];
};

extern struct abc *p;
主要功能

prompt> cat main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "foo.h"  

struct abc q, *p;
extern int func();

int               
main()
{     
    p = &q; 

    /*
     * Using strcpy after allocating memory.
     */

    p->a[0] = malloc(strlen("zero") + 1);
    strcpy(p->a[0], "zero");

    /*
     * strdup is equivalent to malloc and strcpy
     */

    p->a[1] = strdup("one");

    p->a[2] = "two";
    p->a[3] = "three";
    p->a[4] = "four"
    p->var = 10;

    printf("main var = %d, string = %s %s %s %s %s\n", 
        p->var, p->a[0], p->a[1], p->a[2], p->a[3], p->a[4]);
    func();

    return(0);
}             

您是否已将p定义为全局变量?在另一个源文件中声明为extern?请创建一个称为a的完整示例来向我们展示。我们很难知道您在这里做什么。请发布您的完整代码,包括主函数、其他函数等。希望q和t不是与第二个源文件中的函数无关的函数中的局部变量?不确定您到底想做什么,但p->a[0]=&t[0];如果写为p->a[0]=&t;甚至p->a[0]=t;问题是您的t变量是第一个文件的局部变量,当您的t变量在第二个文件中时,t不再有效,因此您的程序将崩溃。感谢您的评论。在我上面提供的程序中,我只使用了一个字符串,但我的应用程序需要多个字符串,这就是我使用指针数组来保存多个Sting的原因。我不知道为什么我可以读取结构的其他成员数据,但不能读取另一个文件中的stings。我已经更新了代码以显示五个字符串。希望这能有所帮助。您可以尝试使用strcpy将p->a[0]=0复制到另一个文件中的p->a[0]并尝试读取p->a[0],而不是像这样复制到字符指针。我已经更新了代码以显示malloc+strcpy和strdup的示例
prompt> cat main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "foo.h"  

struct abc q, *p;
extern int func();

int               
main()
{     
    p = &q; 

    /*
     * Using strcpy after allocating memory.
     */

    p->a[0] = malloc(strlen("zero") + 1);
    strcpy(p->a[0], "zero");

    /*
     * strdup is equivalent to malloc and strcpy
     */

    p->a[1] = strdup("one");

    p->a[2] = "two";
    p->a[3] = "three";
    p->a[4] = "four"
    p->var = 10;

    printf("main var = %d, string = %s %s %s %s %s\n", 
        p->var, p->a[0], p->a[1], p->a[2], p->a[3], p->a[4]);
    func();

    return(0);
}             
prompt> cat func.c
#include <stdio.h>
#include "foo.h"  

int             
func()
{     
    int r;

    r = printf("func var = %d, string = %s %s %s %s %s\n", 
        p->var, p->a[0], p->a[1], p->a[2], p->a[3], p->a[4]);

    return(r);
}
prompt> gcc mainc.c func.c
prompt> a.out
main var = 10, string = zero one two three four
func var = 10, string = zero one two three four