尝试创建一个struct指针数组但在统计上得到堆/缓冲区/ etc违规

时间:2017-11-13 15:49:49

标签: c visual-studio

我有两个结构

typedef enum { False = 0, True = 1 } bool;
//defenition of candy structure
typedef struct _Candy {
    char candy_name[16];
    bool vegan;
}Candy;
typedef struct _Child {
    char child_name[16];
    Candy *candy_of_child;
}Child;

现在我试图创建一个指针数组,每个指针都是Child类型 [*孩子,*孩子......]等 现在我可以初始化它,我需要动态地做它

执行的功能是:

int AllocateKidsArray(int NumOfKids, Child** ptr_to_child_arr) {
//=================================================
//"AllocateKidsArray" intializing an array of childrens
//Input:  1. int indicating the number of kids
//        2. pointer to an array of children
//Output: 1. return an int value {0}->Success {-1}->Failure
//        2. pointer to an empty initialized array of childerns
//=================================================
// array of length NumOfKids, consisting of Child pointers
Child **ptr_to_childs = malloc(NumOfKids * sizeof(Child*));
int i;
for (i = 0; i < NumOfKids; i++) {
    ptr_to_childs[i] = malloc(sizeof(Child));
    strncpy((*ptr_to_childs[i]).child_name, "", 16);
    (*ptr_to_childs)[i].candy_of_child = NULL;
}
*ptr_to_child_arr = *ptr_to_childs;
//for (i = 0; i < NumOfKids; i++) {
//  free(ptr_to_childs[i]);
//}
//free(ptr_to_childs);
return 0;
}

我以下列方式从主电话中调用它:

int main(int argc, char** argv) {
//=================================================
if (argc < 3) {
    printf("Incorrect number of arguments. Please invoke the program \n\t./program.exe < input.txt> <output.txt> \n");
    exit(1);
}
int i, lines, checker = 0;
Candy *test = NULL;
char* name_test = NULL;
char* candy_test = NULL;
char* line = "Tamar,Apple\n";
int* NumLinesFile = NULL;
Child *ArrayOfChild = NULL;
.
.
.
//GetNumLines check
printf("%s\n", argv[0]);
printf("%s\n", argv[1]);
printf("%s\n", argv[2]);
GetNumLines(argv[1], &NumLinesFile);
lines = *NumLinesFile;
*NumLinesFile = NULL;
printf("%d\n", lines);
//=================================================
//AllocateKidsArray check
//AllocateKidsArray(lines, &ArrayOfChild);
AllocateKidsArray(lines, &ArrayOfChild);
//ImportKidsArray check
ImportKidsArray(argv[1], lines, &ArrayOfChild);
for (i = 0; i < lines; i++) {
    //ArrayOfChild[i].candy_of_child = (Candy*) malloc(sizeof(Candy*));
    printf("%s,%s\n", ArrayOfChild[i].child_name, ArrayOfChild[i].candy_of_child->candy_name);
}
//=================================================

并且我统计上得到堆/缓冲区违规 我怀疑这个功能,但我不知道它有什么问题。

在数组初始化之后,我将它传递给另一个填充它的函数:

int ImportKidsArray(char* file_addr, int num_kids, Child** array_of_kids_to_fill) {
//=================================================
//"ImportKidsArray" reads the file and assign each valid line to cell in the array
//Input:  1. string to a location of a file
//        2. int indicating the number of kids
//        3. pointer to an array of children
//Output: 1. return an int value {0}->Success {-1}->Failure
//        2. pointer to an initialized array of childerns
//=================================================
FILE *fp;
char character;
char line[32];
int i = 0, j = 1, checker = 0, arr_count = 0;
char* TempChild = NULL;
char* TempCandy = NULL;
Child *arr = *array_of_kids_to_fill;

fp = fopen(file_addr, "r");
// Check if file exists
if (fp == NULL) {
    printf("Could not open file %s", file_addr);
    return -1;
}
while (!feof(fp)) {
    fgets(line, 32, fp);
    checker = ParseLine(line, &TempChild, &TempCandy);
    GetCandy(TempCandy, &(arr[arr_count].candy_of_child));
    strncpy((arr[arr_count]).child_name, TempChild, 16);
    arr_count++;

}
return 0;
}

如果有人可以提供帮助,那将会挽救我的生命:)

1 个答案:

答案 0 :(得分:0)

您想要更改为FusedLocationProviderClient.requestLocationUpdates。从ArrayOfChild传递地址。

通过适当地取消引用来更改它。

main()

然后在*ptr_to_childs = malloc(NumOfKids * sizeof(Child)); 上执行其余操作。这将保留您在被调用函数中所做的更改。

同时检查*ptr_to_childs的返回值。并且免费(使用malloc)动态分配的内存。

如果您仔细注意,您将在free()函数中看到您正在使用局部变量ArrayOfChild()。你当然不希望这样,因为当函数结束时该变量不会存活。

Child **ptr_to_childs也不适合使用。检查this链接。

另一件事是检查while (!feof(fp))的返回值。

  

成功时,该函数返回相同的char *fgets(char *str, int n, FILE *stream)参数。如果   遇到文件结尾,没有读取任何字符,   str的内容保持不变,返回NULL。