2016-02-14 2 views
-4
#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; 
} 

привет всем :) Я не понимаю, как вы видите, я пытаюсь использовать нераспределенную память, поэтому я ожидаю получить агрессивную ошибку от компилятора. извините мой плохой английский язык. спасибо за ваше время :) Valgrind report :Почему компилятор не дает мне ошибку?

+0

Некоторые вещи, которые вам просто нужно отлаживать. Он не может отображать ошибки, которые появляются только во время выполнения. –

+0

Даже если массив был жестко закодирован, компилятор C не будет препятствовать индексированию за пределами его границ. Для указателя компилятор может даже не знать, сколько памяти вы выделите во время выполнения. Это зависит от вас, чтобы проверить индексацию массива. –

+0

В зависимости от вашей среды разработки вы можете найти инструмент отладки, например valgrind. Valgrind может точно определить такие ошибки во время выполнения. http://valgrind.org/ –

ответ

5
//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]); 

Обычно вы не получите таких ошибок компилятора, это до вас, чтобы следить за ним. Это красота или темная сторона C. И если возникает такая проблема, то есть undefined behaviour (UB), результаты которой еще хуже.

Так это зависит от вас. Некоторые флагов компилятора или статические анализаторы иногда могут вам помочь, когда доступ к границам недоступен.

То же самое относится ко многим другим связанным с этим вопросам, по которым компилятор не предупреждает вас, и вы получаете UB - поэтому на таких языках, как C или C++, вам действительно нужно знать, что вы делаете.

Опять же в этом конкретном случае, если размер массива, который вы указываете во время выполнения, компилятор может даже не знать, какой будет размер массива, поэтому он не может дать вам ошибку. Даже если бы это было известно, компилятор не всегда будет рассказывать вам о доступе к массиву за пределами границ.

+0

спасибо, что это хорошая статья – younesky

+0

@younesky приветствую вас, вы можете больше узнать о UB, если вас интересуют такие языки, как C или C++ –

+0

i love C, это сложно, но это дало мне больше всего контроля – younesky

0

Компилятор не проверяет, существует ли доступ к памяти во время компиляции. Все это делается во время выполнения операционной системы. Это не само C, которое вызывает ошибки сегментации, но на самом деле ваша операционная система говорит C останавливаться.

+0

Я не видел, что Гиорги уже написал этот ответ, мой плохой! :) – dustinroepsch

+0

это нормально, может быть много ответов, если вы думаете, что ваш добавляет что-то –

Смежные вопросы