如何使用数组数组来存储C语言中可变长度的字符串?

如何使用数组数组来存储C语言中可变长度的字符串?,c,C,下面是我的代码 int main(){ char *movies[500]; int i=0; while(*(movies[i])!='$'){ scanf("%s",(movies[i])); i++; } } 输出是分段错误。有人能解释一下吗?movies[i]=malloc(); movies[i] = malloc(<size>); 在向每个指针写入内容之前,为其分配内存 您的指针movies[i]没有指

下面是我的代码

int main(){
   char *movies[500];
   int i=0;

   while(*(movies[i])!='$'){
        scanf("%s",(movies[i]));
        i++;  
   }
}
输出是分段错误。有人能解释一下吗?

movies[i]=malloc();
movies[i] = malloc(<size>); 
在向每个指针写入内容之前,为其分配内存

您的指针
movies[i]
没有指向任何有效的内存位置,您尝试对其进行写入,这将导致未定义的行为,从而导致崩溃


一旦使用了内存
free()
它相应地首先,你就没有数组了;您有一个指针数组。当您这样做时,您必须在执行时分配各个字符串。如果您有一个数组,您可以这样声明它:

char movies[500][500]; // <<== Not recommended

循环在读取任何内容之前测试
电影[i]
时,您的
。它可能是一个
do-while
循环,因此它在阅读后进行测试。为什么我不能像在char*movies[500]中那样使用do-while循环,并且不会自动分配空间char*movies[500];int i=0;do{scanf(“%s”,(电影[i]);}而(*(电影[i++])!=“$”)@AdityaSharma是的,重点是你需要为指针分配内存。你拥有的
char*movies[500]
是指针数组,你需要为每个指针分配内存。这是它的用途。我可以直接使用char-movies[500][500]@AdityaSharma有两段堆栈和堆。当需要时,您可以使用指针数组在堆上动态分配内存。若您通过创建2D数组在堆栈上分配内存,那个么当我制作电影=(int)malloc();。它给出一个警告:来自不兼容指针类型[默认启用]movies[i]=(int)malloc(100)。为什么会这样??
char buf[500];
int count = 0;
for (;;) {
    scanf("%s", buf);
    // Check exit condition here
    if (buf[0] == '$') {
        break;
    }
    // Make a copy
    movies[count] = malloc(strlen(buf)+1);
    strcpy(movies[count++], buf);
}
...
// Don't forget to free the strings that you allocated
for (int i = 0 ; i != count ; i++) {
    free(movies[i]);
}