【发布时间】:2021-04-07 01:16:01
【问题描述】:
我在 Windows 的 CLion 和 Cygwin 工具链(gcc 和 gdb)中运行了这个 C 代码,我尝试写入未分配的 str[5]:
#include <stdio.h>
#include "stdlib.h"
int main() {
char * str = malloc(4);
str[5] = 'a';
printf("%c\n", str[5]);
return 0;
}
但是,它运行时没有任何错误(我预计会出现内存访问冲突和我没有释放分配的指针的警告)。
这是 CMakeLists.txt 的配置方式(我刚刚添加了 CMAKE_C_FLAGS 行):
cmake_minimum_required(VERSION 3.17)
project(myproject C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror")
add_executable(myproject main.c)
为什么它没有为该内存访问引发警告/错误?我该如何解决?
【问题讨论】:
-
不是完全重复的,因为上面的标签是 C++,但答案是一样的:stackoverflow.com/questions/1239938/…
-
您没有收到访问冲突消息,因为没有访问冲突。超出数组范围的访问是未定义的行为(google that),这可能会也可能不会导致访问冲突。这个问题有很多重复。并且不释放指针不会在特殊调试环境之外给出任何诊断消息。
-
@Chase 当我在 Visual Studio 中编写相同的代码时,我会抛出异常。我在 CLion 中也有同样的期待。
-
@nscode 其实就是未定义行为的意思。它可能会起作用,或者它可能会从你的鼻子里喷出龙。
-
@nscode 请注意,运行时“异常”与编译时警告(这是您所要求的)根本不同。运行时异常与您使用的编辑器/编译器无关。这取决于您的程序本身执行了哪些指令,以及操作系统/内核采取了哪些步骤来防止您的程序可能损坏系统。
标签: c gcc clion jetbrains-ide