阵列malloc&;自由的

阵列malloc&;自由的,c,arrays,C,Arrays,我对数组有问题 它显示了一个错误:“lab2.exe中0x5A90B2CE(msvcr120d.dll)处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。”当我要释放integer-age的内存时(空闲(my_array[I][1]) 有人能帮我吗?我不知道我该怎么办 #include "stdafx.h" #include <stdlib.h> #include <stdio.h> void * my_array[5][3]; int i

我对数组有问题

它显示了一个错误:“lab2.exe中0x5A90B2CE(msvcr120d.dll)处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。”当我要释放integer-age的内存时(空闲(my_array[I][1])

有人能帮我吗?我不知道我该怎么办

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



void * my_array[5][3];
int i, j, age;
const int max = 50;

void memory_loc();
void getting_values();
void showing_values();
void memory_free();

int _tmain(int argc, _TCHAR* argv[])
{
    memory_loc();
    getting_values();
    showing_values();
    memory_free();

    system("pause");

    return 0;
}

void memory_loc()
{
    for (i = 0; i<5; i++)
    {
        my_array[i][0] = malloc(sizeof(char)* 50);
        my_array[i][1] = malloc(sizeof(int));
        my_array[i][2] = malloc(sizeof(char)* 50);
    }
}

void getting_values()
{
    for (i = 0; i<5; i++)
    {
        printf("\n%d\n", i);
        printf("Name and surname: \n");
        fgets((char*)my_array[i][0], max, stdin);

        printf("Age: \n");
        scanf("%d", &age);
        (int*)my_array[i][1] = age;
        getc(stdin);

        printf("Location: \n");
        fgets((char*)my_array[i][2], max, stdin);
    }
}

void showing_values()
{
    for (i = 0; i<5; i++)
    {
        printf("\nName and surname: %s", my_array[i][0]);
        printf("\nAge: %d", my_array[i][1]);
        printf("\nLocation: %s", my_array[i][2]);
    }
}

void memory_free()
{
    for (i = 4; i>=0; i--)
    {
        free(my_array[i][2]);
        free(my_array[i][1]);
        free(my_array[i][0]);
    }
}
#包括“stdafx.h”
#包括
#包括
void*my_数组[5][3];
int i,j,年龄;
常数int max=50;
无效内存_loc();
无效获取_值();
void显示_值();
无效内存_free();
int _tmain(int argc,_TCHAR*argv[]
{
内存_loc();
获取_值();
显示_值();
内存空闲();
系统(“暂停”);
返回0;
}
无效内存_loc()
{

对于(i=0;i您更改了
my_数组[i][1]
指向此处的内容:

(int*)my_array[i][1] = age;
这会导致
free
中出现异常,因为您试图释放尚未分配的内存

你可能想写:

*(int*)(my_array[i][1]) = age;


正如有人评论的那样,如果您阅读了编译器警告,您可能会发现这一点。您应该得到一条警告,说明您正在将整数隐式转换为指针或类似性质的内容。

您更改了my_array[i][1]
指向此处的内容:

(int*)my_array[i][1] = age;
这会导致
free
中出现异常,因为您试图释放尚未分配的内存

你可能想写:

*(int*)(my_array[i][1]) = age;


正如有人评论的那样,如果您阅读了编译器警告,您可能会发现这一点。您应该得到一条警告,说明您正在将整数隐式转换为指针或类似性质的内容。

检查编译器的警告消息,您会犯一些错误。您不必按相反顺序释放
,因此您可以执行JU(i=0;i<5;i++)
结尾处使用相同的
为什么
void*
多维数组?为什么不使用
struct{int age;char*name;char*location;};
?顺便说一句,如果要存储一组自由长度字符串,典型的模式是使用
结构{int age;size_t name_length;size_t location_length;char name_location[];};
malloc
-ing
sizeof(S)+name\u length+location\u length
并将字符串附加到结构的内容中;您可以通过结构末尾未指定长度的数组访问它们。检查编译器的警告消息,您有两个错误。您不必按相反的顺序
释放
,因此您只需使用相同的
(i=0;i<5;i++)
在末尾为什么是
void*
多维数组?为什么不是
struct{int age;char*name;char*location;};
?顺便说一句,如果要存储一组自由长度字符串,典型的模式是使用
struct S{int age;size\t name\u length;size\t location\u length;char name\u location[]}
malloc
-ing
sizeof(S)+name\u length+location\u length
并将字符串附加到结构的内容中;您可以通过结构末尾未指定长度的数组访问它们。
my\u数组[i][1]
不是
int
,而是
void*
。因此,
(int)(my\u数组[i][1] )=age;
不是将
age
的值分配给
my_array[i][1]
指向的内存位置的正确方法。使用
*(int*)(my_array[i][1])=age;
就像我在回答中写的那样。同样,当你想得到值时,使用
*(int*)(my_array[i][1])
。是的,我写了
*(int*)(my_array[i][1])=age;
就像你写的那样,我只是在这里正确发布它时遇到了一些问题。但是现在我在获取值方面遇到了问题,因为在我的show_values函数中,它显示的是内存位置,而不是age的值。
我的_数组[I][1]
不是
int
,而是
void*
。因此,
(int)(我的数组[I][1])=age;
不是将
age
的值分配给
my_array[i][1]
指向的内存位置的正确方法。使用
*(int*)(my_array[i][1])=age;
就像我在回答中写的那样。同样,当你想得到值时,使用
*(int*)(my_array[i][1])
。是的,我写了
*(int*)(my_array[i][1])=age;
就像你写的,我只是在这里正确发布它时遇到了一些问题。但是现在我在获取值方面遇到了问题,因为在我的show_values函数中,它显示的是内存位置,而不是age的值。