Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
public:memdebug0 [2015/02/05 23:52]
Jiří Weiser odstraněno
public:memdebug0 [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
-====== Ladění nefunkčního programu - pole položek ======+<code c array.c>​ 
 +#include <​stdio.h>​ 
 +#include <​malloc.h>​ 
 +#include <​string.h>​
  
-Níže uvedený program dynamicky alokuje pole struktur //item// a uloží do něj hodnoty od 1 do 10 (item.dataa stejnou hodnotu modulo 2 (item.data2). Přestože jej lze zkompilovattak tento program obsahuje celou řadu záměrně vložených chyb. Vašim úkolem je jeho oprava tak, aby: +void vypisDelky(char **pole, int m)
-  - nepadal se SIGSEGV ​(nekorektní zápis do paměti) +void vypisHodnoty(char **pole,int m); 
-  - vypisoval všechny vložené položky +void uvolniPole(char **pole,int m);
-  - neměl žádné memory leaks +
  
-Tento nekorektní program vznikl drobnými úpravami korektního kódu. Program tedy celý nepřepisujte,​ pouze se snažte nalézt chyby a opravte je. Není nutné přidávat žádné dodatečné funkce, pouze upravujte existující. K řešení využijte debugger, dodatečné ladící výstupy a tužku a papír.+int main(void) 
 +
 +    char **array2d;​ 
 +    int n;
  
-Očekávaný výstup programu je+    printf("​Pocet retezcu"); 
-    ​1 : 1 +    ​scanf("​%d",&​n);​ 
-    ​2 : +    ​array2d = malloc(n*sizeof(char));​ 
-    ​3 : 1 +    for(int i=0;​i<​=n;​i++) 
-    4 : +    ​{ 
-    ​5 : 1 +        ​array2d[i]=malloc(sizeof(char));​ 
-    ​0 +        for(int j=0;​array2d[i][j]!='​\n';​j++)array2d[i][j]=j;​ 
-    ​7 : 1 +    ​} 
-    ​0 +    ​printf("​Delky retezcu:\n"); 
-    ​1 +    ​vypisDelky(array2d,​n);​ 
-    ​10 : 0+    ​printf("​Hodnoty retezcu:\n"​);​ 
 +    vypisHodnoty(array2d,​n);​ 
 +    ​uvolniPole(array2d,​n);​ 
 +    printf("​pole je na adrese0x%p\n",​(void*)array2d);​ 
 +    ​return ​0
 +}
  
-<code c stack_problems1.c>​ +void vypisDelky(char **pole,int m) 
-#​include ​<stdio.h> +
-#include <stdlib.h> +    for(int i=0;i<=m;i++) 
-#include <​unistd.h>​+    { 
 +        printf("​Delka %dretezce je %u\n",​i,​(unsigned)strlen(pole[i]));​ 
 +    }
  
-typedef struct { 
-    int data; 
-    int data2; 
-} item; 
- 
-void allocateItems(item* items, int numItems) { 
-    items = malloc(sizeof(item));​ 
-    for (int i = 0; i < numItems; i++) { 
-        items[i].data = i + 1; 
-        items[i].data2 = (i + 1) % 2; 
-    } 
 } }
  
-void printItems(itemitems, int numItems) { +void vypisHodnoty(char **pole,int m) 
-    for (int i = 1; i <= numItems; i++) { +
-        printf("​%d : %d\n", ​items[i].dataitems[i].data2);+    for(int i=0;i<=m;i++) 
 +    ​
 +        printf("​%d. retezec je\"%s\"\n",i,pole[i]);
     }     }
 } }
  
-const int SIZE = 10; +void uvolniPole(char **pole,int m) 
-int main() ​+
-    ​usleep(50000);​ // only for debugger to catch on (otherwise program will finish before debugger can react) +   ​for(int i=0;i<​=m;​i++) 
-    item* items NULL+     free(pole[i]); 
- +   free(pole);
-    allocateItems(items, SIZE); +
-    ​printItems(items, SIZE)+
- +
-    return 0;+
 } }
 +         
 </​code>​ </​code>​
- 
- 
- 
- 
QR Code
QR Code public:memdebug0 (generated for current page)