2011-07-25 40 views
1

我想在C中有一些动态增长的数组/数据结构。下面是我拥有的C代码。但是在打印数组后,它会产生运行时错误,如下面的快照中所示。出了什么问题?它正在Windows-7上使用MS-Visual C++ 2010(免费版)进行编译。这个C代码中使用realloc的错误是什么?

enter image description here

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
int *a; 
int i = 5; 

if((a = (int *)malloc(i * sizeof(int))) == NULL) { 
    fprintf(stderr, "Error: failed malloc\n"); 
    return 1; 
} 
for(i = 0; i < 5; i++) 
    a[i] = i; 

printf("-- array after malloc\n"); 
for(i = 0; i < 5; i++) 
    printf(" a[%d] = %d\n", i, a[i]); 

if((a = (int *)realloc(a, i * sizeof(int))) == NULL) { 
    fprintf(stderr, "Error: failed realloc\n"); 
    return 1; 
} 
for(i = 0; i < 10; i++) 
    a[i] = i; 


printf("\n-- array after realloc\n"); 
for(i = 0; i < 10; i++) 
    printf(" a[%d] = %d\n", i, a[i]); 


free(a); 
return 0; 
} 

回答

2
//<important> 
//weren't you supposed to do i = 10 here ???? 
//</important> 
if((a = (int *)realloc(a, i * sizeof(int))) == NULL) { 
    fprintf(stderr, "Error: failed realloc\n"); 
    return 1; 
} 
for(i = 0; i < 10; i++) 
    a[i] = i; 

我觉得这是应该调整阵列10并使用它,但你永远不改变i10所以i仍然是5和你出去的范围

+0

'i'是4,而不是5 – orlp

+0

@nightcracker:'i'是5,而不是4 :) –

+0

喔woops :)(15个字符) – orlp

1

关于此线:

if((a = (int *)realloc(a, i * sizeof(int))) == NULL) { 

i仍然包含值5。所以基本上你是realloc'5个整数,而你在下一个循环中分配10个整数:一个错误。

这将是固定的代码:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
int *a; 
int i; 

if((a = (int *)malloc(5 * sizeof(int))) == NULL) { 
    fprintf(stderr, "Error: failed malloc\n"); 
    return 1; 
} 

for(i = 0; i < 5; i++) 
    a[i] = i; 

printf("-- array after malloc\n"); 
for(i = 0; i < 5; i++) 
    printf(" a[%d] = %d\n", i, a[i]); 

if((a = (int *)realloc(a, 10 * sizeof(int))) == NULL) { 
    fprintf(stderr, "Error: failed realloc\n"); 
    return 1; 
} 

for(i = 0; i < 10; i++) 
    a[i] = i; 

printf("\n-- array after realloc\n"); 
for(i = 0; i < 10; i++) 
    printf(" a[%d] = %d\n", i, a[i]); 


free(a); 
return 0; 
} 
+0

我是5不是4.以前的for循环终止于5. – goldenmean

+0

@Goldenmean:是的,对不起,我有一点失败的时刻。 – orlp