定义结构的程序本地指针

时间:2015-11-06 18:41:27

标签: c pointers scope structure

我的问题涉及创建在整个程序文件中可见的变量。换句话说,文件本地变量。

考虑这个例子

#include <stdio.h>

struct foo
{
    char s[] = "HELLO";
    int n = 5;
};

struct foo *a;

int main()
{
    puts("Dummy outputs!\n");
    printf("%s\n",a->s);
    printf("%d\n",a->n);
    return 0;
}

现在,此代码段不会运行 为什么呢?
因为指向变量 a 的结构不会被分配,因为语句从未执行过。

现在,如何在不改变此变量 a 范围的情况下分配它?

4 个答案:

答案 0 :(得分:2)

#include <stdio.h>

struct foo {
    char const *s;
    int n;
};

/* static for file-local */
static struct foo a = { "HELLO" , 5 };

int main(void) {
    printf("%s\n", a.s);
    printf("%d\n", a.n);
    return 0;
}

答案 1 :(得分:1)

  

现在,如何在不改变此变量范围的情况下分配它?

我确信有很多方法可以解决您的问题。这是我的建议。

  1. struct foo的定义更改为s中包含固定数量的字符。

  2. 创建a作为对象而不是指针。用必要的值初始化它。

  3. a设为static变量,因此其使用仅限于该文件。

  4. 在文件的其余部分使用对象a而不是指针a

  5. #include <stdio.h>
    
    struct foo
    {
       char s[20];
       int n;
    };
    
    static struct foo a = {"HELLO", 20};
    
    int main()
    {
        puts("Dummy outputs!\n");
        printf("%s\n",a.s);
        printf("%d\n",a.n);
        return 0;
    }
    

答案 2 :(得分:0)

此:

struct foo
{
    char s[] = "HELLO";
    int n = 5;
};

无效的C代码。您首先声明类型:

struct foo
{
    char s[10];
    int n;
};

然后定义该类型的变量:

static struct foo a = { "HELLO", 5 };

static关键字允许此变量具有文件本地范围。

您现在可以像这样使用它:

static struct foo a = { "HELLO", 5 };

void other()
{
    puts("Dummy outputs!\n");
    printf("%s\n",a.s);
    printf("%d\n",a.n);
}

int main()
{
    puts("Dummy outputs!\n");
    printf("%s\n",a.s);
    printf("%d\n",a.n);
    other();
    return 0;
}

请注意,可以从两个函数访问a。但是,它不会从其他文件中定义的函数中查看,因为它被声明为static

至于直接使用指针和结构,你可以随时以这种方式使用它的地址:

some_function(&a);

答案 3 :(得分:0)

  

好吧,我需要直接使用指针代替结构

试试这个:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>

struct foo{
    char s[20];
    int n;
};


int main(void){
    struct foo *a;
    a = malloc(sizeof(struct foo));
    puts("Dummy outputs!\n");
    strcpy(a->s, "HELLO");
    a->n = 5;
    printf("%s\n",a->s);
    printf("%d\n",a->n);

    free(a);
    return 0;
}

输出:

Dummy outputs!
HELLO
5