void test(u_long *vector, int nLines) {
int i, j;
u_long *bkpVector=(u_long *)malloc(0);
for (i=0; i<=100000; i+=10000) {
printf("vector of size: i=%d\n\n", i);
if (i>0) {
if (bkpVector!=NULL) {
printf("NOT NULL\n");
bkpVector=(u_long *)realloc(bkpVector, i*sizeof(u_long));
}
else {
printf("NULL POINTER\n");
bkpVector= (u_long *)malloc(i*sizeof(u_long));
}
}
//printf("Vector: ");
for (j=0; j<i; j++) {
printf("null: %d ", bkpVector==NULL);
bkpVector[j]=vector[j];
}
//printf("\nz\n\n");
TestBubbleSort(2, bkpVector, i);
for (j=0; j<i; j++)
bkpVector[j]=vector[j];
TestInsertionSort(2, bkpVector, i);
for (j=0; j<i; j++)
bkpVector[j]=vector[j];
TestMergeSort(2, bkpVector, i);
printf("\n");
}
free(bkpVector);
}
它通常在bkpVector[j]=vector[j];
行崩溃。你们对可能出现的问题有什么建议吗?有人可以帮忙吗?我是 SO 的新手,请原谅我任何错误。非常感谢你!
答案 0 :(得分:0)
你的代码中有很多错误。
首先,它隐含地假设vector
具有(至少)100000
个元素。如果不是这样,那么形式的两个循环
for(j=0; j<i; j++)
bkpVector[j]=vector[j];
将显示i
的任何值超出vector
中实际元素数量的未定义行为。
其次,malloc()
和realloc()
可能会失败 - 如果有,则返回NULL
指针。您的代码只是像数组一样使用返回的值,而不检查分配是否成功。如果已返回NULL
,则执行此操作会导致未定义的行为。
最后,在C语言中这是一个非常糟糕的主意 - 尽管在某些圈子中提倡它 - 转换(也就是类型转换)来自malloc()
或realloc()
的返回值。需要这样做(例如,为了避免来自C编译器的诊断)通常意味着您忘记了#include <stdlib.h>
,在这种情况下,通过执行类型转换强制代码编译会导致未定义的行为。 [注意 - 如果你的C编译器实际上是一个C ++编译器,也需要进行类型转换,但是由于各种原因,在C ++中使用malloc()
和realloc()
也是不可取的。]
未定义行为的常见症状是程序崩溃。
虽然并非严格不正确,但malloc(0)
通常认为这是一个糟糕的主意。在您的使用中,将bkpVector
初始化为NULL
就足够了。