我一直认为这const char **x是一个正确的类型,用于动态分配的const字符串数组,如下所示:
#include <stdlib.h>
int main()
{
const char **arr = malloc(10 * sizeof(const char *));
const char *str = "Hello!";
arr[0] = str;
free(arr);
}
Run Code Online (Sandbox Code Playgroud)
但是,在使用VS2017编译此代码时,我会收到此警告free:
warning C4090: 'function': different 'const' qualifiers
Run Code Online (Sandbox Code Playgroud)
我的代码有问题吗?FWIW,当我和GCC一起编译时,即使有了,也没有任何警告-Wall -Wextra -pedantic.
有人提出一个论点,说在现代C中,我们应该总是通过数组指针将数组传递给函数,因为数组指针具有强类型.例:
void func (size_t n, int (*arr)[n]);
...
int array [3];
func(3, &array);
Run Code Online (Sandbox Code Playgroud)
这听起来像防止各种类型相关和数组越界错误可能是一个好主意.但后来我发现我不知道如何将const正确性应用于此.
如果我这样做void func (size_t n, const int (*arr)[n])那么它是正确的.但是由于指针类型不兼容,我无法再传递数组.int (*)[3]对比const int (*)[3].限定符属于指向的数据,而不属于指针本身.
调用者中的显式强制转换将破坏增加类型安全性的整个想法.
如何将const正确性应用于作为参数传递的数组指针?它可能吗?
编辑
就像信息一样,有人说通过像这样的指针传递数组的想法可能源于MISRA C++:2008 5-2-12.例如,请参阅PRQA的高完整性C++标准.
我刚刚注意到对C11标准进行了修正,称为ISO/IEC 9899:2011/Cor 1:2012.
此更新中发生了哪些变化?
我试图理解C语言的一些基础知识.CRC编程语言说
函数调用是一个后缀表达式,称为函数指示符,后跟括号,其中包含可能为空的逗号分隔的赋值表达式列表(Par.A7.17),它们构成函数的参数.
在函数调用中,运算符是什么,操作数是什么?
是()运营商吗?
函数名是操作数吗?
()操作数内的参数是什么?
谢谢.
c kernighan-and-ritchie language-lawyer function-call-operator
我刚才下面的代码可以用铿锵/ GCC /铛++/G ++编译注意到,使用c99,c11,c++11标准.
int main(void) {
int i = i;
}
Run Code Online (Sandbox Code Playgroud)
甚至-Wall -Wextra,没有一个编制者甚至报告警告.
通过修改代码int i = i + 1;和使用-Wall,他们可能会报告:
why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
int i = i + 1;
~ ^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
我的问题:
我不小心提交了一个构建到app store的"Build active architecture only"(ONLY_ACTIVE_ARCH)设置为"Yes".我存档的手机是3GS.这是否意味着具有其他架构的手机,如带有ARMv7S的iPhone 5,将无法运行该应用程序?
对于一些基地.基数1甚至.某种复杂的替代.
此外,当然,在现实生产代码中这样做并不是一个好主意.我只是出于好奇而被问到.
如何在aspx页面中动态设置独立(不在gridview)超链接控件的内联NavigateUrl属性?
我试图做以下,但它没有奏效.
<asp:HyperLink id="MyLink"
NavigateUrl="../mypage.aspx?id=<%= pageid %>"
runat="server">My Page</asp:HyperLink>
Run Code Online (Sandbox Code Playgroud) 该gets()功能已从C语言中删除.标准中不存在此类功能.
然而,我编译以下代码:
#include <stdio.h>
int main (void)
{
(void) gets (NULL);
}
Run Code Online (Sandbox Code Playgroud)
运用
gcc -std=c11 -pedantic-errors -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)
它编译时没有给出任何错误或警告.同样的,
#include <stdio.h>
int gets;
int main (void)
{}
Run Code Online (Sandbox Code Playgroud)
不会编译(错误:'获得'重新声明为不同类型的符号).
在标准4.一致性§6中,我们可以阅读:
符合实现的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为
鉴于上述情况,我认为即使在迂腐模式下,gcc也不符合标准.是否有一个原因?这是故意还是错误?
GCC版本4.9.1.
编辑:
gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1
Run Code Online (Sandbox Code Playgroud)