Tag: const

在C中,const变量是否保证在内存中是不同的?

说到字符串文字,C99标准说(6.4.5.6): 如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的。 如果程序试图修改此类数组,则行为未定义。 我找不到类似的警告或对const变量的明确保证。 可以在上下文中使用表达式&x == &y const int x=12; const int y=12; const int x=12; const int y=12; 评价为1 ? const变量和字符串文字怎么样(即使在32位little-endian平台上, &x == “\014\000\000″保证为0 )? 对于它的价值, 本博客文章中的 “字符串文字”部分给出了问题的背景。

指向C中的const字符串的指针

char *p = “string”; //creates pointer to constant string char p[] = “string”; //just an array with “string” 我只是有点困惑为什么在第一个例子中创建一个指向常量字符串的指针? 它不应该只是一个指针指向内存中有“字符串”的地方吗?

如何在C中声明一个常量函数指针数组?

我需要声明一个指向函数的指针数组,如下所示: extern void function1(void); extern void function2(void); … void (*MESSAGE_HANDLERS[])(void) = { function1, function2, … }; 但是,我希望将数组声明为常量 – 数组中的数据和指向数据的指针。 不幸的是,我不记得在哪里放置const关键字。 我假设在这种情况下,实际指针MESSAGE_HANDLERS已经是常量,因为它被声明为数组。 另一方面,如果声明如图所示,那么数组中的函数指针是否可以在运行时更改?

为什么允许使用memcpy使用指向它的指针覆盖const变量?

为什么允许使用memcpy指向它来更改const变量? 这段代码: const int i=5; int j = 0; memcpy(&j, &i, sizeof(int)); printf(“Source: i = %d, dest: j = %d\n”, i,j); j = 100; memcpy(&i, &j, sizeof(int)); printf(“Source: j = %d, dest: i = %d\n”, j,i); return 0; 编译只是一个警告: 警告:传递’memcpy’的参数1从指针目标类型中丢弃’const’限定符[默认启用] 但确实运行得很好,并改变了const变量的值。

为什么我不能在memcpy中使用const参数?

我有一个struct cVector3d ,我struct cVector3d它像这样的char数组: void insert_into_stream(std::ostream& stream, cVector3d vector) { int length = sizeof(double)*3; char insert_buffer[sizeof(double)*3]; memcpy(insert_buffer, &vector[0], length); stream.write(insert_buffer, length); } 如果我在参数列表中使用const cVector3d vector ,那么我得到一个“ & requires l-value ”错误。

什么`int const a `真正意味着什么?

考虑以下数组声明: int const a[5]; 从语言的语义角度来看,它是否完全等同于const int a[5] ? 假设是这种情况,两个声明基本上都会读作“ a是5个常量整数的数组 ”。 读取第一个声明的另一种方法是“ a是一个5个整数的常量数组 ”。 显然,这两个陈述逻辑上都暗示整个数组是不变的; 如果一个数组由5个常量整数组成,则整个数组是常量。 或者,如果整个数组是常量,那么它的所有值也是常量。 我知道“常量数组”的概念有点无意义,因为数组不是可修改的左值(也就是说,它们不能出现在赋值的左侧)。 但是,在这两种声明会产生不同行为的情况下是否存在? ( Cdecl.org拒绝将第一个声明作为语法错误,而大多数当前编译器都接受它。) 编辑: 链接的副本询问const的顺序是否对普通变量很重要。 对于数组,它有点混乱,所以我不认为这是重复的。

正确性和不可变分配对象

在最近的讨论中(参见对这个答案的评论),R ..建议永远不要为指针到const类型创建别名,因为你无法在一致的C程序中轻松地释放引用的对象(请记住: free()采用非常量指针参数 和C99 6.3.2.3仅允许从非合格到合格的转换 )。 C语言显然假定任何已分配对象的所有者存在,即某个地方某人必须存储一个非const指针指向该对象,并且该人负责解除分配。 现在,考虑一个库分配和初始化从用户空间代码不可修改的对象,因此函数调用总是返回const -qualified指针。 显然,库是对象的所有者,并且应该保留非const指针,这有点傻,因为用户已经在每个库调用上提供了完全有效但指针的const副本。 要解除分配这样的对象,库必须丢弃const限定符; 据我所知,以下内容 void dealloc_foo(const struct foo *foo) { free((void *)foo); } 是有效的C; 如果foo参数另外restrict ,它将只是无效。 然而,抛弃const看起来有些黑客攻击。 除了从库函数的所有返回值中删除const之外还有另一种方法,它会丢失有关对象可变性的任何信息吗?

为什么将“指向非const的指针”转换为“指向const的指针”是不合法的

将指向非const的指针转换为指向const的指针是合法的。 那么为什么将指向非const的指针转换为指向const的指针是不合法的呢? 例如,为什么以下代码是非法的: char *s1 = 0; const char *s2 = s1; // OK… char *a[MAX]; // aka char ** const char **ps = a; // error!

C中的Const返回类型

我正在阅读一些代码示例,他们返回了一个const int。 当我尝试编译示例代码时,我遇到了有关冲突返回类型的错误。 所以我开始搜索,认为const是问题(当我删除它时,代码工作正常,不仅编译,而且按预期工作)。 但我从来没有能够找到特定于const返回类型的信息(我为结构/参数/等等做了,但没有返回类型)。 所以我尝试编写一段代码来简单地展示const可以做什么。 我想出了这个: #include int main() { printf(“%i”, method()); } const int method() { return 5; } 当我编译这个时,我得到: $ gcc first.c first.c:7: error: conflicting types for ‘method’ first.c:4: note: previous implicit declaration of ‘method’ was here 但是,每当我删除const时,它就像预期的那样,只打印出一个5,一个继续生命。 所以,任何人都可以告诉我当用作返回类型时const应该是什么意思。 谢谢。

知道是否使用了const限定符

在C中是否有任何方法可以找到变量是否具有const限定符? 或者它是否存储在.rodata部分? 例如,如果我有这个function: void foo(char* myString) {…} 在这两个不同的函数调用中应该采取不同的操作: char str[] = “abc”; foo(str); foo(“def”); 在第一种情况下,我可以修改字符串,在第二种情况下没有。