从这个引用,在C中,似乎以下行为是未定义的.
int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
Run Code Online (Sandbox Code Playgroud)
C++ 03或C++ 11中是否有引用证实了这一点?
函数sleep()在C中是主动等待还是被动等待?
因为它会停止线程运行,所以它总是检查时间是否已经过去,如:
while(1){
//need to wake?
}
Run Code Online (Sandbox Code Playgroud)
或者是被动的:
alarm(sec);
pause(); // wait for the alarm and sleeping?
Run Code Online (Sandbox Code Playgroud)
该系统是unix.
我使用以下C代码对MISRA 2004和MISRA 2012运行静态代码分析:
BOOL_TYPE Strings_Are_Equal(const char *s1, const char *s2)
{
BOOL_TYPE result = True;
const char *str1 = s1;
const char *str2 = s2;
if (NULL == s1 || NULL == s2)
{
result = False;
}
else if (strlen(s1) != strlen(s2))
{
result = False;
}
else
{
while (*str1 != 0)
{
if(tolower(*str1++) != tolower(*str2++))
{
result = False;
break;
}
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释第58和66行的代码如何遭受副作用,我该如何纠正?
我在C中使用了这样的构造:
list->head = list->tail = NULL;
Run Code Online (Sandbox Code Playgroud)
现在我考虑这是否真的意味着我想的.
这是什么意思?
list->head = NULL; list->tail = NULL;要么
list->head = list->tail; list->tail = NULL;thx澄清
我是比较新的CMake,我已经开发了一个小的项目,建立一个库,链接到一个共享库,命名external_library。我的CMakeLists.txt文件看起来像这样:
cmake_minimum_required(VERSION 2.8.12)
project(project_name)
include_directories(path_to_external_library_source_code)
add_subdirectory(path_to_external_library_header_files subproject/external_library)
target_link_libraries(project_name external_library)
install(TARGETS project_name DESTINATION installation_path)
Run Code Online (Sandbox Code Playgroud)
当我构建项目(使用make)时,它运行良好,并正确创建了链接(我已使用ldd命令检查过它)。但是,当我尝试安装它(使用make install)时,安装路径中生成的文件未链接到指定的共享库。
ldd再次使用,我查了一下安装路径中生成的库中没有找到共享库,虽然在构建路径中生成的库中找到了。我怎么能解决这个问题?
谢谢。
Pd:我CMake 3.5.1在Ubuntu 16.04.2 LTS.
在子例程调用中,我们保存了PC的内容,以便重新启动我们的调用例程。但是,如果被调用的子例程更改了通用寄存器的值,会发生什么?如果必须访问存储在寄存器中的旧值,它不会对调用子例程造成任何问题吗?
为什么在gcc中编译以下代码不会产生任何类型不匹配警告?-1是int类型,并f()期望类型为char:
void f(char c) {}
int main(void)
{
f(-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即使我们明确指定了类型,也没有警告:
void f(unsigned char c) {}
int main(void)
{
f((signed int)-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
什么是好奇:如果我们指定超出范围的值,则打印警告:
void f(char c) {}
int main(void)
{
f(65535);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
warning: overflow in implicit constant conversion
gcc版本6.1.1
考虑以下代码:
#include <stdio.h>
int main()
{
char A = A ? 0[&A] & !A : A^A;
putchar(A);
}
Run Code Online (Sandbox Code Playgroud)
我想问一下,是否观察到任何未定义的行为.
编辑
请注意:代码故意使用0[&A] & !A和NOT A & !A(请参阅下面的回复)
结束编辑
从g ++ 6.3(https://godbolt.org/g/4db6uO)获取输出ASM 得到(没有使用优化):
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov BYTE PTR [rbp-1], 0
movzx eax, BYTE PTR [rbp-1]
movsx eax, al
mov edi, eax
call putchar
mov eax, 0
leave
ret
Run Code Online (Sandbox Code Playgroud)
然而clang为同一件事提供了更多的代码(没有再次优化):
main: # @main
push rbp
mov rbp, rsp
sub rsp, 16 …Run Code Online (Sandbox Code Playgroud) (我引用的是ISO/IEC 9899:201x)
在这里我们看到,整数常量表达式具有整数类型:
6.6常量表达式
6. 整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,_Alignof表达式以及作为强制转换的直接操作数的浮点常量.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof或_Alignof运算符的操作数的一部分.
这适用于任何整数类型:
6.2.6.2整数类型
5.未指定任何填充位的值.符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值.对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示.
然后我们看到使用值为0的整数常量表达式定义空指针常量.
6.3.2.3指针
3. 值为0的整型常量表达式或类型为void*的表达式称为空指针常量.如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较.
因此,空指针常量必须将其所有位设置为零.
但是在线和StackOverflow上有很多答案说这不是真的.
给出引用的部分,我很难相信他们.
(请使用最新标准的参考答案)
我写了一些以下代码.
#include "stdio.h"
int main(){
float t,res;
char c;
scanf("%f",&t);
getchar();
scanf("%s",&c);
if (c=='R') res = 4/5 * t;
else if (c=='F') res = (9/5 * t) + 32;
else if (c=='K') res = t + 273;
printf("%.2f",&res);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我给出t = 25和c ='R'时,我不知道为什么输出显示为0.00.控制台看起来像这样.
25
R
0.00
Run Code Online (Sandbox Code Playgroud)
有人会给我一个解释吗?