【问题标题】:dynamically allocated 2d array in CC中动态分配的二维数组
【发布时间】:2017-04-11 19:24:29
【问题描述】:

在为字符创建二维数组时,我需要一些清晰的认识。 这个我知道

char *str="hellowww";//here its a constant string

str 可以指向“hellowwww”字符串,无需任何内存分配。 所以

char *str[5]

应该能够对每个元素做同样的事情。 所以如果是这样的话,

1) char *str[5] 是二维字符数组吗?

2) 在这种情况下,我们什么时候需要使用 malloc 和 free?

3) 我知道我可以像在 2d 整数数组中那样为 malloc 创建一个循环,但有什么意义吗?

#include <stdio.h>
#include <string.h>

int main(void)
{
char *arr[6];
int i, j;


arr[0] = "hurr1";
arr[1] = "hurr2";
arr[2] = "hurr3";
arr[3] = "hurr4";
arr[4] = "hurr5";
arr[5] = "hurr6";

for(i = 0; i < 6; i++)
{
    for(j = 0; j<strlen(arr[i])+1;j++)
        printf("%c", arr[i][j]);
printf("\n");
}

}

以上程序无需任何 malloc 或 free 即可运行,我可以访问每个字符。

【问题讨论】:

  • 1)。不,它是一个指针数组。 2)。如果您想动态分配内存,可能是为了存储一些用户输入或让“数组”内容存在于分配范围之外。 3)。我不会撒谎,我不知道你在问什么,你能澄清一下吗?
  • 没有动态内存分配。
  • 另请注意,上述程序将允许您访问(即读取)所有字符,但不允许您编写它们,因为字符串文字是不可变的。

标签: c arrays string


【解决方案1】:
char *str;

为指针分配足够的字节,它期望稍后会用字符的地址填充(可能是序列的第一个,并且可能通过动态分配内存)。

char *str = "hello";

分配指针,并为字符串“hello”及其终止的0字节分配一个6字节的缓冲区(可能在只读内存中),并使指针指向它。

我不知道“没有任何内存分配”是什么意思。

char *str[5];

为五个连续的指针分配一块内存,它期望稍后会被填充。这是二维数组吗?不,尽管如果您碰巧为每个指针分配了一系列字符的地址,str[x][y] 将访问xth 字符串的yth 字符,使其看起来像一个二维数组。

【讨论】:

    【解决方案2】:
    char *str[5]
    

    应该能够对每个元素做同样的事情

    这绝对正确:str 的五个元素中的每一个都可以指向一个字符串。

    1. char *str[5] 是二维字符数组吗?

    没有。它是字符指针的一维数组。您可以将其视为二维数组,但如果您愿意,您可以灵活地不填写某些维度。

    1. 在这种情况下,我们什么时候需要使用 malloc 和 free?

    这取决于您想在str[5] 的元素中添加什么,以及您是否想修改这些内容。如果将字符串文字放在所有五个元素中,则根本不需要malloc,但您拥有的字符串不允许修改。

    1. 我知道我可以为malloc 创建一个循环,就像我们在二维整数数组中所做的那样,但有什么意义吗?

    同样,这取决于您要达到的目标。您可以有一个动态分配内存的循环,您可以使用字符串文字,使用指向静态分配的可修改字符串的指针,以及您可以使用字符指针执行的任何其他操作。

    【讨论】:

    • 那么我认为从来没有二维数组。当然,我的程序的用途非常有限,但是根据 C 中二维数组的定义,它是一个二维数组,但实际上只是一个一维数组。
    • @acidlategamer C 确实有多维数组,例如char x[5][10] 但它们的尺寸限制为相同的长度。使用指针数组时,可以根据需要更改维度中每个元素的大小。
    • 我在程序中写的是一个指针数组。我可以为每个字符串分配任何长度的字符串。那么它会变成二维数组吗?在动态情况下,当我为每一行执行 malloc 时,我必须有一个“列”可变长度,所以当我必须使用 malloc(sizeof(char)*y 时,arr[x][y] 中的元素大小如何变化),因为 'y' 是一行中的最大字符数。
    • @acidlategamer 由于您放入数组中的所有行都具有相同的大小(6 个字符),因此您可以将 char str[][6] = {"hurr1", "hurr2", "hurr3", "hurr4", "hurr5", "hurr6"}; 初始化器用于大小为 6x6 的二维数组。
    猜你喜欢
    • 2021-02-03
    • 2015-09-17
    • 1970-01-01
    • 2015-02-10
    • 2013-11-14
    • 2017-03-11
    • 2012-02-06
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多