2017-10-11 14 views
-2

J'ai alloué de l'espace pour un pointeur char et j'ai essayé d'accéder au-delà de l'espace alloué mais toujours pas de faute de segmentation. mon code est comme ci-dessous:Acesser au-delà de l'espace alloué et ne pas segfault

char *src = malloc(4); 
    strcpy(src, "1234"); 
    char *temp; 
    for(int i = 0 ; i<5 ; i++) { 
     temp = src; 
     srC++;  
     printf("ite ch %c\n",src[0]); 
    } 
    printf("Still no segfault %s\n",temp); 

Maintenant, ma question est: comment puis-je aller au-delà de l'espace alloué? Ne devrais-je pas obtenir une erreur de segmentation?

+5

Le comportement indéfini est indéfini. Il n'y a aucune garantie qu'il soit détecté du tout. – Deduplicator

+0

C est une langue de bas niveau. Il vous permettra heureusement de vous tirer dans le pied tout ce que vous aimez, et peut ou ne peut pas vous avertir. –

+1

"Ne devrais-je pas avoir une erreur de segmentation?" Non. C ne vous spécifie pas de faute de seg_. Cela peut arriver. C'est UB. D'autres langues peuvent spécifier qu'une erreur seg doit se produire. Cela nécessite souvent du code ou des performances supplémentaires. Si [roues de formation] (https://en.wikipedia.org/wiki/Training_wheels) sont nécessaires, envisagez d'autres langues. – chux

Répondre

1

Lorsque vous écrivez après la fin d'un bloc de mémoire allouée par malloc comme vous l'avez fait ici, vous appelez undefined behavior.

Un comportement indéfini signifie que le comportement du programme ne peut pas être prédit. Il pourrait tomber en panne, il pourrait produire des résultats étranges, ou il pourrait sembler fonctionner correctement. En outre, une modification apparemment sans rapport, telle que l'ajout d'une variable locale inutilisée ou un appel à printf pour le débogage, peut modifier la façon dont le comportement non défini se manifeste. Pour résumer, avec un comportement indéfini, ce n'est pas parce que le programme risque de planter.

0

L'implémentation de la fonction malloc() est spécifique au système et à la bibliothèque. L'une des choses que de nombreuses implémentations d'allocation de mémoire doivent gérer est la fragmentation de la mémoire.

Le code de question alloue 4 octets. Afin de minimiser la fragmentation de la mémoire, de nombreux systèmes allouent réellement plus de 4; peut-être un minimum de 16 octets. Cela permet à la fois de satisfaire la requête malloc (4) et de conserver des fragments de mémoire (une fois la mémoire libérée) à une taille minimale de 16 octets. Par conséquent, un "pool de fragments de mémoire" de 16 fragments d'octets peut être utilisé pour satisfaire une requête malloc() de 1 à 16 octets. De nombreux systèmes de gestion de mémoire maintiennent des "pools de fragments de mémoire" de 16, 32, 64, 128, (etc) octets chacun. Par exemple, si un appel de malloc (44) est effectué, un fragment de mémoire du pool de 64 octets peut satisfaire la requête.

Sur certains systèmes, il est possible de déterminer la taille réelle du fragment de mémoire renvoyé par malloc(). Sur un système Linux, la fonction malloc_usable_size() exécute cette fonction. Les systèmes OS X peuvent utiliser malloc_size().