指向struct中常量字符串的指针

时间:2016-08-23 09:39:53

标签: c string pointers struct const

我在用C语言写作。

header1.h中,我声明了一个指向常量字符串(char的常量数组)的指针,一个带有struct和这种类型变量的新类型,以及另一个变量:

const char *str_ptr = "Hello world!";

struct entry_t {
const char *text;
int var;
};
typedef entry_t entry;

extern entry start_entry;

int a;

在文件func.c中,我定义了新变量:

#include "header1.h"

entry start_entry = {str_ptr, a};

void func(void)
{
    //here i use start_entry
}

但编译器报告错误

  

需要持续表达

指的是start_entry的初始化,特别是const char*成员的初始化。 为什么?错误在哪里?

当然,如果我将字符串定义为

const char str[] = "Hello world!";

然后将entry变量设为

entry start_entry = {&str, a};

一切都很好。

EDIT_1

我在报告代码时犯了两个错误:

  1. var也是const

    struct entry_t { const char * text; const int var; };

  2. func.c 条目中的
  3. 也是const

    const entry start_entry;

  4. EDIT_2

    我不关心 var ,我对const char *成员感兴趣(即使可能问题是相同的:我之前写错了代码,也是{{1}我有一个错误......)。 我要重新定义所有:

    int var

    我无法理解为什么 start_entry 有一个//header1.h const char *str_ptr = "Hello world!"; struct entry_t { const char *text; }; typedef entry_t entry; extern const entry start_entry; //func.c #include header1.h const entry start_entry = {str_ptr}; void func(void) { //here i use start_entry } 成员,我用const char*定义它,但是有错误。

2 个答案:

答案 0 :(得分:0)

问题在于,使用C编译器无法在全局范围内初始化此类语句,它被视为函数外部的代码: (就像你不能调用函数来获取tis返回值并初始化函数外的全局一样)

entry start_entry = {str_ptr, a};

str_ptr在C中并不被视为常量,因为它被视为指针。 const限定符在此处不执行任何操作。

(问题也发生在a BTW上,看起来你正在使用一些奇怪的C ++编译器或一个特殊的C99选项,请参阅pmg评论)

简单地调用g++时,您的示例就有效。

请注意您的“自然”陈述

entry start_entry = {&str, a};

编译(使用你的编译器,gcc仍然因为a而拒绝它)但是因为你传递了指针的地址,而不是指针本身=>未指明的行为:不好。

如果你想这样做,我建议你使用C ++编译器。

简单的gcc调用有什么作用:

char str_ptr[] = "Hello world!";
entry start_entry = {str_ptr, 12}; // considered as an array, value decided by the compiler, even if const keyword is missing

什么不

const char *str_ptr = "Hello world!";
entry start_entry = {str_ptr, 12}; // str_ptr is considered as a variable pointer even if const

entry start_entry = {"Hello world!", a}; // a is a variable: nocantdo

你正确的地方是char []告诉编译器指针是不变的,即使没有const关键字BTW,而const关键字也没有被考虑在内。

注意:

我必须修复你的代码,以便用我的gcc编译器编译:

typedef struct  {
const char *text;
int var;
} entry;

extern entry start_entry;

另一点是:避免在头文件中声明全局变量,因为如果你有多个包含它的代码文件,你会得到多个包含或未定义的符号。

答案 1 :(得分:0)

您只能在初始值设定项中使用编译时常量。变量 str_ptr 甚至不是运行时常量。 <div class="myDiv">ASJKLJKLS <div class="q"> <div class="w"> <div class="e"> <div class="r"> </div> </div> </div> </div> 限定符的作用是防止 str_ptr 指向的字符串被修改。指针本身可以重新分配。因此,您需要在初始化函数中初始化您的开始条目:

const