在C

时间:2017-04-11 19:24:29

标签: c arrays string

我需要清楚地为角色创建一个二维数组。 我知道这个

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

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

char *str[5]

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

1)char * str [5]是2d字符数组吗?

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,我可以访问每个角色。

2 个答案:

答案 0 :(得分:1)

char *str;

为指针分配足够的字节,它稍后会在字符的地址中填充(可能是序列的第一个,也可能是动态分配内存)。

char *str = "hello";

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

我不知道你的意思&#34;没有任何内存分配&#34;

char *str[5];

为五个连续指针分配一块内存,它预计将在稍后的时间填充。这是一个2D阵列吗?不,虽然如果您碰巧为每个指针指定了一系列字符的地址,str[x][y]将访问y字符串的x字符,使其看起来像2d阵列。

答案 1 :(得分:1)

char *str[5]
     

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

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

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

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

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

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

  
      
  1. 我知道我可以为malloc创建一个循环,就像我们在2d整数数组中那样,但是有一点吗?
  2.   

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