小编250*_*501的帖子

我可以使用指针访问多维数组吗?

这个引用,在C中,似乎以下行为是未定义的.

int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
Run Code Online (Sandbox Code Playgroud)

C++ 03或C++ 11中是否有引用证实了这一点?

c++ arrays pointers multidimensional-array

4
推荐指数
1
解决办法
788
查看次数

函数sleep()是否在被动状态下激活?

函数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 operating-system sleep system system-calls

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

双方都有副作用吗?

我使用以下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)

并从PC-lint报告中得到以下结论: 在此输入图像描述

有人可以解释第58和66行的代码如何遭受副作用,我该如何纠正?

c lint side-effects misra pc-lint

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

C:传递(双重)作业

我在C中使用了这样的构造:

list->head = list->tail = NULL;
Run Code Online (Sandbox Code Playgroud)

现在我考虑这是否真的意味着我想的.

这是什么意思?

  1. list->head = NULL; list->tail = NULL;

要么

  1. list->head = list->tail; list->tail = NULL;

thx澄清

c variable-assignment assignment-operator

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

cmake:“make install”不会链接到 Ubuntu 中的库

我是比较新的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.1Ubuntu 16.04.2 LTS.

ubuntu cmake gnu-make

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

为什么在子例程调用中没有完整的上下文保存?

在子例程调用中,我们保存了PC的内容,以便重新启动我们的调用例程。但是,如果被调用的子例程更改了通用寄存器的值,会发生什么?如果必须访问存储在寄存器中的旧值,它不会对调用子例程造成任何问题吗?

assembly call cpu-registers context-switch subroutine

2
推荐指数
1
解决办法
321
查看次数

为什么gcc不会为int和char生成类型不匹配警告?

为什么在gcc中编译以下代码不会产生任何类型不匹配警告?-1int类型,并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

c gcc-warning

2
推荐指数
1
解决办法
592
查看次数

未定义的行为或未定义的行为

考虑以下代码:

#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)

c undefined-behavior language-lawyer

2
推荐指数
1
解决办法
248
查看次数

标准是否定义空指针常量以将所有位设置为零?

(我引用的是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上有很多答案说这不是真的.

给出引用的部分,我很难相信他们.

(请使用最新标准的参考答案)

c standards language-lawyer

1
推荐指数
2
解决办法
550
查看次数

C代码的非逻辑输出

我写了一些以下代码.

#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)

有人会给我一个解释吗?

c pointers char nested-if

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