Tag: const correctness

我可以将const char *数组传递给execv吗?

这是execv的原型: int execv(const char *path, char *const argv[]); 我可以传递一个const char指针数组作为第二个参数吗? 此示例程序在未设置USE_CAST时发出警告: #include int main(int argc, char *argv[]) { if (argc > 0) { const char *exe_name = “/bin/echo”, *message = “You ran”; const char *exe_args[] = { exe_name, message, argv[0], NULL }; #ifdef USE_CAST execv(“/bin/echo”, (char **) exe_args); #else execv(“/bin/echo”, exe_args); #endif } return 0; […]

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

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

为什么endptr参数是strtof和strtod一个指向非const char指针的指针?

标准C库函数strtof和strtod具有以下签名: float strtof(const char *str, char **endptr); double strtod(const char *str, char **endptr); 它们将输入字符串str分解为三个部分: 空白的初始,可能是空的序列 表示浮点值的字符的“主题序列” 无法识别(并且不影响转换)的字符的“尾随序列”。 如果endptr不是NULL ,则*endptr被设置为指向紧跟在转换的一部分的最后一个字符之后的字符的指针(换句话说,尾随序列的开始)。 我想知道:为什么endptr ,然后,指向非const char指针? 是不是*endptr指向一个const char字符串(输入字符串str )?

const指针结构的正确性

我有一个包含一些指针的结构。 我希望这些价值不可修改。 但简单地写const infront并不会使结构成员不可改变 typedef struct{ int *x; int *y; }point; void get(const point *p,int x, int y){ p->x[0]=x;//y[0]=y;//<- this should not be allowed } 有人能指出我正确的方向。 编辑: 因此,似乎没有简单的方法来使用函数原型来告诉属于该结构的所有内容都应该是不可修改的

指向常量函数的指针的含义是什么?

指针可以声明为指向可变(非常量)数据或指向常量数据的指针。 可以将指针定义为指向函数。 我的同事和我正在讨论使用带有指针的“const”,并且出现了关于const与函数指针一起使用的问题。 以下是一些问题: 指向常量函数的指针与指向非常量函数的指针的含义是什么? 函数可以是常量吗? 函数可以是非const(可变)吗? 传递函数指针的正确(安全)语法是什么? 编辑1:函数指针语法 typedef void (*Function_Pointer)(void); // Pointer to void function returning void. void function_a(Function_Pointer p_func); // Example 1. void function_b(const Function_Pointer p_func); // Example 2. void function_c(Function_Pointer const p_func); // Example 3. void function_d(const Function_Pointer const p_func); // Example 4. 上述声明是将函数指针视为指向内部类型的指针的示例。 数据,变量或存储器指针允许上述组合。 所以问题是:函数指针是否具有相同的组合以及指向const函数的指针(例如示例2)是什么意思?

const数组指针的正确性?

有人提出一个论点,说在现代C中,我们应该总是通过数组指针将数组传递给函数,因为数组指针具有强类型。 例: void func (size_t n, int (*arr)[n]); … int array [3]; func(3, &array); 这听起来像防止各种类型相关和数组越界错误可能是一个好主意。 但后来我发现我不知道如何将const正确性应用于此。 如果我执行void func (size_t n, const int (*arr)[n])那么它是const正确的。 但是由于指针类型不兼容,我无法再传递数组。 int (*)[3]与const int (*)[3] 。 限定符属于指向数据而不属于指针本身。 调用者中的显式强制转换会破坏增加类型安全性的整个想法。 如何将const正确性应用于作为参数传递的数组指针? 它可能吗? 编辑 就像信息一样,有人说通过像这样的指针传递数组的想法可能源于MISRA C ++:2008 5-2-12。 例如,请参阅PRQA的高完整性C ++标准 。