从 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;
}
我试图从 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;
}