从 C 中的用户输入创建一维字符串数组

Creating a 1-D array of strings from user input in C

我试图从 C 中的用户输入创建一个数组。我的代码如下

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

char** create_array(int num);

int main(){
    char** my_array;
    int i;
    printf("%s", "Input the size of the array: ");
    scanf("%d", &i);
    my_array = create_array(i);
    for (int m = 0; m < i; m++){
        printf("%s\n", (char*)my_array[m]);
    }
}
char ** create_array(int num){
    char** array = malloc(num * sizeof(char*));
    for (int i = 0; i < num; i++) {
        char temp[32];
        printf("Input element %d of the array: ", i);
        scanf("%s", temp);
        array[i] = temp;
    }
    for (int m = 0; m < num; m++){
        printf("%s\n", array[m]);
    }
    printf("end of func\n");
    return array;
}

在我将 temp 的声明从 char *temp; 替换为 char temp[32]; 之前,我遇到了(可能无关?)分段错误问题。我不确定为什么将 temp 声明为字符指针会导致分段错误,如果这是一个简单的相关答案,请告诉我,否则我会在另一个问题中提问。

但是,当我运行这段代码时,输​​入

Input the size of the array: 2
Input element 0 of the array: value0
Input element 1 of the array: value1

我明白了

value1
value1
end of func


Segmentation fault (core dumped)

所以对我来说,当 for 循环执行下一次迭代时,temp 似乎并没有改变。我不确定为什么或如何会发生这种情况。我也试过改变

printf("%s\n", my_array[m]);

printf("%s\n", (char*)my_array[m]);

但这似乎也无济于事。

有什么想法吗? 谢谢

我相信这就是您要找的。诀窍是为堆上的字符串分配内存。保存指向 char temp[32]; 的指针是危险的,因为它在自动存储中。正如@Spikatrix 在评论中所说,不能保证内存在循环的每次迭代之间处于有效状态。对于堆上的数据,有一个明确定义的内存区域被预留并由从 malloc.

返回的指针标识

还有很多不使用 scanf 的充分理由。照原样,您的代码不执行任何边界检查,并且可以轻松覆盖为每个字符串分配的 32 字节数组。

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

char** create_array(int num);

int main(){

    int num_strings;
    printf("Input the size of the array: ");
    scanf("%d", &num_strings);
    printf("\n");

    char** my_array = create_array(num_strings);

    for (int i = 0; i < num_strings; i++){
        printf("%s\n", my_array[i]);
    }

    for (int i = 0; i < num_strings; i++) {
        free(my_array[i]);
    }

    free(my_array);
}

char** create_array(int num) {

    char** array = malloc(num * sizeof(char*));

    for (int i = 0; i < num; i++) {
        array[i] = malloc(32);
        printf("Input element %d of the array: ", i);
        scanf("%s", array[i]);
        printf("\n");
    }

    printf("end of func\n");
    return array;
}