设置和使用不适用于C的不同范围内的变量

时间:2014-10-15 03:06:05

标签: c arrays variables scope printf

我在两个不同的范围内打印出一个变量(变量对两者都是可见的),并且在控制台中得到了不同的结果。

我正在尝试在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
}

1 个答案:

答案 0 :(得分:1)

我发现您的代码存在以下问题:

  1. init_one_D_Array中的以下几行出现问题。

    array.array = (int*)malloc(sizeof(int));
    array.array[0] = (int)malloc(sizeof(int));
    

    您不应该在第一行中转换malloc的返回值。第二行很奇怪。我不知道你想要完成什么,但这不仅是不必要的,而且还可能导致内存泄漏。用

    替换这些行
    array.array = malloc(sizeof(int));
    
  2. addToArray中以下行的问题。

    array.array[array.lastIndx] = (int)malloc(sizeof(int));
    

    我不知道你要用上述声明完成什么。但是,根据函数的名称判断,您需要:

    array.array = realloc(array.array, sizeof(int)*(array.lastIndx+1));
    
  3. addArrayToArray中以下行的问题。

    else array[oldcount] = malloc(sizeof(int *));
    

    此问题与上一个问题类似。再次,根据您的功能名称判断,您需要:

    else array = realloc(array, sizeof(int*)*(oldcount+1));
    
  4. 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);
    
  5. http://ideone.com/yD6W4y的工作计划。