指向字符常量的指针

时间:2014-04-06 08:50:38

标签: c

很抱歉这里真是太笨了。不能为自己解决这个问题。

在头文件中有一个像这样的宏。

#define kOID  "1.3.6.1.4.1.1.1.2.4.0"

如何在不创建此字符串副本的情况下声明和初始化指向此数据的char指针?

4 个答案:

答案 0 :(得分:3)

预处理器宏只是一个文本替换。因此,如果你写

  const char *pointer = kOID;

预处理器将用

替换文本
  const char *pointer = "1.3.6.1.4.1.1.1.2.4.0";

要记住的一点是const说明符是必要的,因为一旦进行了文本替换,内存将被分配在只读段上。

另外要小心,在您要声明指针的位置显示宏。

答案 1 :(得分:2)

假设您不打算更改此字符串的内容,您只需使用:

char* p = kOID;

该字符串将驻留在程序的只读部分,因此任何更改其内容的尝试都将导致在运行时期间发生内存访问冲突。所以为了您自己的安全,您通常应该使用:

const char* p = kOID;

因此,任何更改p指向的字符串内容的尝试都将导致编译时错误而不是运行时错误。前者通常比后者更容易追踪和修复。

要总结const问题,可以使用以下选项:

      char*       p = kOID;
      char* const p = kOID; // compilation error if you change the pointer
const char*       p = kOID; // compilation error if you change the pointed data
const char* const p = kOID; // compilation error if you change either one of them

更新 - 内存使用注意事项:

请注意,每个此类声明都可能导致额外的内存使用量,加上字符串的长度加上一个字符,加上指针的4或8个字节(取决于您的系统)。现在,指针可能不是一个问题,但如果你在代码中的几个地方实例化它,那么字符串本身可能会产生大量的内存使用。因此,如果您计划在程序中的不同位置使用字符串,那么您应该在一个地方全局声明它。

此外,请注意,字符串可能位于程序的代码部分或程序的数据部分。根据您的内存分区,您可能更喜欢将它放在一个地方而不是另一个地方。

答案 2 :(得分:1)

首先包含头文件。

#include <header.h>

添加定义的常量

char * s = kOID;

这将编译程序正常。但是,由于kOID是一个字符串文字,它将被保存在程序的只读存储器中。因此,如果您修改s,则会导致Segmentation fault。解决方法是使s保持不变。

const char * s = kOID;

现在,如果您编译程序,编译器将检查s上的任何作业并相应注意。

a.c: In function ‘main’:
a.c:10:5: error: assignment of read-only location ‘*s’

所以你是安全的。

答案 3 :(得分:0)

要添加其他人所说的内容,您也可以这样初始化数组:

const char some_string[] = kOID;

这类似于const char *const some_string = kOID;。可能,它可能导致额外的内存分配,但这取决于编译器。