我在两个不同的范围内打印出一个变量(变量对两者都是可见的),并且在控制台中得到了不同的结果。
我正在尝试在C中创建动态数组。我已经编写了处理分配内存的函数,现在我只是在验证一切正常工作的最后一步。以下是我的测试程序。
在LOOP A
中打印出数组的值时,我得到以下内容
<<0:2000000000>>
<<1:2000000000>>
<<2:2000000000>>
但是当在循环B中打印出相同数组中的相同值时,我得到了胡言乱语,可能是数组中未初始化索引的结果:
<<0:/*-*/20975841/*-*/22222222>>
<<1:2222222222>>
<<2:2222222222>>
以下是结构和宏
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <objc/objc.h>
#define PRINT_STR(str) {\
printf(str);\
}
typedef struct {
int lastIndx;
int *array;
}one_D_Array;
//##################Helper Functions#############################
int sizeint = 1;
void print_Array(int *array, int lastInd) {
for (int i = 0; i <=lastInd ; i++) {
printf("%d",array[i]);
}
}
void printVal(int val) {
printf("%d", val);
}
int countOfArray(int *ar){
int sizf = sizeof(ar) / sizeof(int) + 1;
printVal(sizf);
return sizf;
}
int scanInt(){
int begin;
scanf("%d",&begin);
return begin;
}
//##################1D Array#############################
one_D_Array init_one_D_Array() {
one_D_Array array;
array.array = (int*)malloc(sizeof(int));
array.array[0] = (int)malloc(sizeof(int));
array.lastIndx = 0;
return array;
}
one_D_Array addToArray(one_D_Array array, int toAdd) {
// int *newAr;
// newAr.array = (int *)malloc(array.lastIndx * sizeof(int))
array.array[array.lastIndx] = (int)malloc(sizeof(int));
array.array[array.lastIndx] = toAdd;
array.lastIndx++;
return array;
}
//##################2D Array#############################
int **init_2d_Array(void) {
int **newarr = (int **)malloc(sizeof(int *));
return newarr;
}
void print2dArray(int **array, int len, int lastInd) {
for (int range = 0; range <= lastInd; range++) {
for (int r2 = 0; r2 < len; r2++) {
printVal(array[range][r2]);
}
}
}
int **addArrayToArray(int **array, int *toAdd, int oldcount){//This should add a 1d array to a 2d array
if (array == NULL ) {printf("Array must be initialized"); exit(1);}
else array[oldcount] = malloc(sizeof(int *));
array[oldcount] = toAdd;
return array;
}
和main()
int main()
{
PRINT_STR("Please enter a number");
int ttlLoops = scanInt(); //Total Number of loops run
int count = 0; //How many times the loop has run in total
int **tu_D = init_2d_Array();
//LOOP A
for (int x = 0; x < ttlLoops;x++) {
one_D_Array ar2 = init_one_D_Array(); //Initializing a one_D_Array
ar2.lastIndx = 0;
for (int i = 0; i < 10; i++) {
ar2 = addToArray(ar2, 2); //Adding to the one dimensional array an int
}
*tu_D = *addArrayToArray(tu_D, ar2.array, count); //Adding the one dimensional array to a 2d array
printf("\n<<%d:",count");
print_Array(tu_D[count], 9); //Printing the 1D array just saved above into the 2D array
PRINT_STR(">>\n");
count ++;
}
//LOOP A
//LOOP B
for (int i =0; i < count; i++) {
printf("\n<<%d:",i);
print_Array(tu_D[i], 9);
PRINT_STR(">>\n");
}
return 0;
//LOOP B
}
答案 0 :(得分:1)
我发现您的代码存在以下问题:
init_one_D_Array
中的以下几行出现问题。
array.array = (int*)malloc(sizeof(int));
array.array[0] = (int)malloc(sizeof(int));
您不应该在第一行中转换malloc
的返回值。第二行很奇怪。我不知道你想要完成什么,但这不仅是不必要的,而且还可能导致内存泄漏。用
array.array = malloc(sizeof(int));
addToArray
中以下行的问题。
array.array[array.lastIndx] = (int)malloc(sizeof(int));
我不知道你要用上述声明完成什么。但是,根据函数的名称判断,您需要:
array.array = realloc(array.array, sizeof(int)*(array.lastIndx+1));
addArrayToArray
中以下行的问题。
else array[oldcount] = malloc(sizeof(int *));
此问题与上一个问题类似。再次,根据您的功能名称判断,您需要:
else array = realloc(array, sizeof(int*)*(oldcount+1));
main
中以下行的问题。
*tu_D = *addArrayToArray(tu_D, ar2.array, count); //Adding the one dimensional array to a 2d array
您在该行中的评论以及代码所做的不一致。您只是将返回值int*
中的第一个addArrayToArray
分配给tu_D
的第一个元素。你需要:
tu_D = addArrayToArray(tu_D, ar2.array, count);
http://ideone.com/yD6W4y的工作计划。