我正在努力理解如何创建一个声明;字符串数组";其大小在声明时未知。这就是我目前所掌握的:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n, i;
char** words;
printf("How many strings you want to input? n");
scanf("%d", &n);
words = malloc(sizeof(char*) * n);
for (i = 0; i < n; i++) {
printf("Input your %d string: ", i + 1);
scanf("%s", words[i]);
}
for (i = 0; i < n; i++) {
printf("%sn", words[i]);
}
return 0;
}
程序正在编译,但我得到了一个Segmentation fault
错误。
您只为指向字符串的指针分配内存,而不为字符串本身分配内存。试图在未分配的内存中存储字符串会调用未定义的行为。
指针就是指针。不能在其中存储字符串。您需要为指针应指向的位置保留内存。
#define STR_SIZE 100 // max length of a string (incl. null terminator)
printf("How many strings you want to input? n");
if (scanf("%d", &n) != 1)
{
fputs("Error at input", stderr);
// further error routine.
}
// allocate memory for the pointer to the strings.
words = malloc(sizeof(*words) * n);
if (!words)
{
// error routine if the memory allocation failed.
perror("malloc");
exit(EXIT_FAILURE);
}
// allocate memory for the strings themselves.
for (int i = 0; i < n; i++)
{
words[i] = malloc(sizeof(**words) * STR_SIZE);
if (!words[i])
{
// error routine if the memory allocation failed.
perror("malloc");
exit(EXIT_FAILURE);
}
}
旁注:
如果分配发生错误,请始终检查内存管理函数的返回!输入操作(如
scanf()
(也是如此。请注意,在代码发生更改的情况下,使用
sizeof(*words)
和sizeof(**words)
而不是sizeof(char*)
和sizeof(char)
更安全。
您没有为单个字符指针words[i]
正确分配内存。
这很好-您为指向字符words
:的指针分配了内存
words = malloc(sizeof(char*) * n);
但是,您还没有为那个words
分配单独的指针。为此,您需要为单个单词提供多少缓冲区。举个例子,如果每个单词是100个字符,那么:
for (i = 0; i < n; i++)
{
printf("Input your %d string: ", i + 1);
words[i] = malloc(sizeof(char) * 100); //<--
scanf("%s", words[i]);
}
还记得在完成后释放缓冲区。
for (int i=0; i<n; ++i) {
free(words[i]);
}
free(words);
return 0;