如何在 C 中为二维数组中的每个元素动态分配内存
How to dynamically allocate memory for every element in 2D array in C
如何为二维数组中的每个元素动态分配内存?
例如,我有一个由街道名称(1.column)和街道号码(2.column)组成的地址,例如St.Paul 87/45。我需要为它们动态分配内存。
int main()
{
int c = 1, r = 1; //c-column, r-row
char st_name[] = "St.Paul";
char st_number[] = "87/45";
char *arr = (char *)malloc(c*r*sizeof(char));
c = 0;
r = 0;
*arr[r][c++] = (char *)malloc((strlen(st_name)) * sizeof(char));
*arr[r][c] = (char *)malloc((strlen(st_number)) * sizeof(char));
return 0;
}
当然不行。
谢谢。
你需要的是一个矩阵,但每个矩阵项都是一个 c 字符串,所以是一个数组。
您可以使用 3 个起始指针来完成,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int c = 1, r = 1; //c-column, r-row
char st_name[] = "St.Paul";
char st_number[] = "87/45";
char ***arr = malloc(r*sizeof(char *));
c = 0;
r = 0;
if (arr != NULL)
{
arr[r] = malloc(c*sizeof(char *));
if (arr[r] != NULL)
{
arr[r][c] = malloc(strlen(st_name)+1);
if (arr[r][c] != NULL)
{
c++
arr[r][c] = malloc(strlen(st_number)+1);
if (arr[r][c] != NULL)
{
sprintf( arr[0][0], st_name);
sprintf( arr[0][1], st_number);
printf ("arr[0][0] = %s\n", arr[0][0]);
printf ("arr[0][1] = %s\n", arr[0][1]);
}
}
}
}
return 0;
}
或者您可以使用定义数组中每个项目的结构来做到这一点,例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct item
{
char *name;
char *number;
};
int main(void)
{
char st_name[] = "St.Paul";
char st_number[] = "87/45";
int r = 1;
struct item *arr = malloc(r*sizeof(struct item));
if (arr != NULL)
{
arr[0].name = malloc(strlen(st_name)+1);
arr[0].number = malloc(strlen(st_number)+1);
if ((arr[0].name != NULL) && (arr[0].number != NULL))
{
sprintf( arr[0].name, st_name);
sprintf( arr[0].number, st_number);
printf ("arr[0][0] = %s\n", arr[0].name);
printf ("arr[0][1] = %s\n", arr[0].number);
free(arr[0].name);
free(arr[0].number);
}
free(arr);
}
return 0;
}
如何为二维数组中的每个元素动态分配内存? 例如,我有一个由街道名称(1.column)和街道号码(2.column)组成的地址,例如St.Paul 87/45。我需要为它们动态分配内存。
int main()
{
int c = 1, r = 1; //c-column, r-row
char st_name[] = "St.Paul";
char st_number[] = "87/45";
char *arr = (char *)malloc(c*r*sizeof(char));
c = 0;
r = 0;
*arr[r][c++] = (char *)malloc((strlen(st_name)) * sizeof(char));
*arr[r][c] = (char *)malloc((strlen(st_number)) * sizeof(char));
return 0;
}
当然不行。
谢谢。
你需要的是一个矩阵,但每个矩阵项都是一个 c 字符串,所以是一个数组。
您可以使用 3 个起始指针来完成,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int c = 1, r = 1; //c-column, r-row
char st_name[] = "St.Paul";
char st_number[] = "87/45";
char ***arr = malloc(r*sizeof(char *));
c = 0;
r = 0;
if (arr != NULL)
{
arr[r] = malloc(c*sizeof(char *));
if (arr[r] != NULL)
{
arr[r][c] = malloc(strlen(st_name)+1);
if (arr[r][c] != NULL)
{
c++
arr[r][c] = malloc(strlen(st_number)+1);
if (arr[r][c] != NULL)
{
sprintf( arr[0][0], st_name);
sprintf( arr[0][1], st_number);
printf ("arr[0][0] = %s\n", arr[0][0]);
printf ("arr[0][1] = %s\n", arr[0][1]);
}
}
}
}
return 0;
}
或者您可以使用定义数组中每个项目的结构来做到这一点,例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct item
{
char *name;
char *number;
};
int main(void)
{
char st_name[] = "St.Paul";
char st_number[] = "87/45";
int r = 1;
struct item *arr = malloc(r*sizeof(struct item));
if (arr != NULL)
{
arr[0].name = malloc(strlen(st_name)+1);
arr[0].number = malloc(strlen(st_number)+1);
if ((arr[0].name != NULL) && (arr[0].number != NULL))
{
sprintf( arr[0].name, st_name);
sprintf( arr[0].number, st_number);
printf ("arr[0][0] = %s\n", arr[0].name);
printf ("arr[0][1] = %s\n", arr[0].number);
free(arr[0].name);
free(arr[0].number);
}
free(arr);
}
return 0;
}