为什么编译器不';你不给我错误吗? #包括 #包括 int main(){ 系统(“清除”); int*pt=malloc(2*sizeof*pt); int*tmp=NULL; int i; pt[0]=44; pt[1]=9; printf(“pt[0]:%d\n”,pt[0]); printf(“pt[1]:%d\n”,pt[1]); tmp=realloc(pt,3*sizeof*pt); 如果(!tmp){ printf(“merde alors\n”); }否则{ pt=tmp; 对于(i=0;i

为什么编译器不';你不给我错误吗? #包括 #包括 int main(){ 系统(“清除”); int*pt=malloc(2*sizeof*pt); int*tmp=NULL; int i; pt[0]=44; pt[1]=9; printf(“pt[0]:%d\n”,pt[0]); printf(“pt[1]:%d\n”,pt[1]); tmp=realloc(pt,3*sizeof*pt); 如果(!tmp){ printf(“merde alors\n”); }否则{ pt=tmp; 对于(i=0;i,c,arrays,malloc,realloc,C,Arrays,Malloc,Realloc,大家好:) 我不明白,正如您所看到的,我试图使用未分配的内存,因此我希望收到来自编译器的严重错误。 请原谅我英语不好。 感谢您抽出时间:) 通常情况下,您不会从编译器中得到这样的错误,而是由您来跟踪它。这就是C的美丽或黑暗的一面。如果出现这样的问题,那就是(UB),结果会更糟 所以这取决于你。当存在明显的数组越界访问时,某些编译器标志或静态分析器有时可能会帮助您 对于许多其他相关问题,同样的情况也适用,编译器不警告你,你也得到UB——这就是为什么在C语言或C++语言中,你真的需要知道你在做什么

大家好:) 我不明白,正如您所看到的,我试图使用未分配的内存,因此我希望收到来自编译器的严重错误。 请原谅我英语不好。 感谢您抽出时间:)

通常情况下,您不会从编译器中得到这样的错误,而是由您来跟踪它。这就是C的美丽或黑暗的一面。如果出现这样的问题,那就是(UB),结果会更糟

所以这取决于你。当存在明显的数组越界访问时,某些编译器标志或静态分析器有时可能会帮助您

对于许多其他相关问题,同样的情况也适用,编译器不警告你,你也得到UB——这就是为什么在C语言或C++语言中,你真的需要知道你在做什么。


同样在这种特殊情况下,如果您在运行时指定的数组大小,编译器甚至可能不知道数组大小是什么-所以它不会给您一个错误。即使编译器知道,也不会总是告诉您数组越界访问。

编译器不会检查您正在访问的内存在编译时是否存在。这一切都是在运行时由操作系统完成的。导致分段错误发生的不是C本身,而是您的操作系统告诉C停止。

有些事情需要调试。它不能显示仅在运行时出现的错误。即使数组是硬编码的,C编译器也不会阻止您索引超出其界限。对于指针,编译器甚至可能不知道在运行时将分配多少内存。检查数组索引由您决定。根据您的开发环境,您可能会发现一些调试工具(如valgrind)很有用。Valgrind能够在运行时查明这种错误。您应该从正确格式化代码开始。我可以确认@HenrikCarlqvist的建议有效
valgrind
报告一次无效写入(第20行)和两次无效读取(第15行和第21行)。它还注意到,在出口处仍然分配了大量内存。(它一点也不喜欢你的台词
系统(“clear”)
,我必须先把它删除。)我没看到乔治已经写了这个回复,我的错!:)没关系,如果你认为你的答案是正确的,那么可以有多个答案something@younesky不客气,如果你对C或C++等语言感兴趣,你可以进一步了解UB。我喜欢C,这很难,但它给了我最多control@younesky:您可以使用
valgrind
进行这种错误跟踪。@chqrlie团队Ubuntu说:valgrind无法检测到与代码相关的一些异常。例如,它不检查表声明之外的表上的索引statically@younesky你试过了吗
valgrind
应该能够检测
malloc
以检测分配内存中的缓冲区溢出。您可能需要向其传递特殊标志。阅读
man
页面。
#include <stdio.h>
#include <stdlib.h>

int main() {
    system("clear");
    int *pt = malloc(2 * sizeof *pt);
    int *tmp = NULL;
    int i;

    pt[0] = 44;
    pt[1] = 9;
    printf("pt[0] : %d\n", pt[0]);
    printf("pt[1] : %d\n", pt[1]);
    tmp = realloc(pt, 3 * sizeof *pt);
    if (!tmp) {
        printf("merde alors\n");
    } else {
        pt = tmp;
        for (i = 0; i < 5; i++) {
            pt[i] = i + 1;
            printf("pt[%d] : %d\n", i, pt[i]);
        }
    }
    //the compiler should give me an error here, because I try use an unallocated memory:
    printf("pt[%d] : %d\n", i + 8, pt[i + 8]);
    free(pt);
    return 0;
}
  //the compiler should give me an error here, because i try use an unallocated memory:   
  printf("pt[%d] : %d\n", i+8, pt[i+8]);