相关疑难解决方法(0)

为什么我不能在C中将'char**'转换为'const char*const*'?

以下代码片段(正确)在C中发出警告,在C++中发出错误(分别使用gcc和g ++,使用版本3.4.5和4.2.1进行测试; MSVC似乎并不关心):

char **a;
const char** b = a;
Run Code Online (Sandbox Code Playgroud)

我能理解并接受这个.
这个问题的C++解决方案是将b更改为const char*const*,它不允许重新分配指针并阻止你绕过const-correctness(C++ FAQ).

char **a;
const char* const* b = a;
Run Code Online (Sandbox Code Playgroud)

但是,在纯C中,更正后的版本(使用const char*const*)仍会发出警告,我不明白为什么.有没有办法绕过这个而不使用演员?

澄清:
1)为什么这会在C中产生警告?它应该完全是const安全的,并且C++编译器似乎认识到它.
2)在说(并让编译器强制执行)我不会修改它指向的字符时,接受这个char**作为参数的正确方法是什么?例如,如果我想写一个函数:

void f(const char* const* in) {
  // Only reads the data from in, does not write to it
}
Run Code Online (Sandbox Code Playgroud)

我想在char**上调用它,参数的正确类型是什么?

编辑:感谢那些做出回应的人,特别是那些提出问题和/或跟进我的回复的人.

我已经接受了这样一个答案,即如果没有演员阵容,我想做的事情是无法完成的,无论是否应该这样做.

c pointers const const-correctness

59
推荐指数
3
解决办法
2万
查看次数

为什么`execvp`采用`char*const argv []`?

我想知道两个exec函数之间是否存在不同的原因const,如果这只是Single Unix Spec中的一个错误:

摘自Linux手册页,它似乎与Single Unix Specification一致,这里有两个版本exec:

int execlp(const char *file, const char *arg, ...);
int execvp(const char *
file, char *const argv[]);

execlp将其参数视为const char *,并且它需要两个或更多.const在C中是一个承诺,函数不会改变指向的数据,在这种情况下是char构成字符串的实际字符().

execvp而是将其参数作为指针数组.但是,不是指向const char *你想要的指针数组,const关键字在不同的位置 - 这对C execvp来说很重要,它说它可能会修改字符串中的字符,但它承诺不会修改数组 - 即指向字符串的指针.所以,换句话说,

int fake_execvp(const char *file, char *const argv[]) {
    argv[0] = "some other string"; /* this is an error */
    argv[0][0] = 'f'; …
Run Code Online (Sandbox Code Playgroud)

c api exec

14
推荐指数
1
解决办法
1768
查看次数

C++禁止指针转换指针

在C++中,Type **Type const **转换被禁止.此外,不允许从转换derived **Base **.

为什么这些转换会重要?还有其他例子指向指针转换的指针不会发生吗?

有没有办法解决:如何将指向指向非const类型对象的指针转换为指向类型的const对象的Type指针Type,因为Type **- > Type const **不成功?

c++ pointers type-conversion

3
推荐指数
1
解决办法
1015
查看次数

标签 统计

c ×2

pointers ×2

api ×1

c++ ×1

const ×1

const-correctness ×1

exec ×1

type-conversion ×1