Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建数组的动态声明_C_Arrays_Variables_Dynamic_Declaration - Fatal编程技术网

C 创建数组的动态声明

C 创建数组的动态声明,c,arrays,variables,dynamic,declaration,C,Arrays,Variables,Dynamic,Declaration,我想创建一个数组,它将被动态声明,我想象这样的事情。我想制作一个能识别单词中字符的程序 char i; scanf("%c",&i); char word[]=i; printf("%c",word[0]); 我也试过这样的方法: char i; scanf(%c,&i); char *word=i; printf("%c",word[0]); 我不知道如何使它工作。让我们从基础开始。您在编写时声明的内容: char

我想创建一个数组,它将被动态声明,我想象这样的事情。我想制作一个能识别单词中字符的程序

char i;
scanf("%c",&i);
char word[]=i;
printf("%c",word[0]);
我也试过这样的方法:

char i;
scanf(%c,&i);
char *word=i;
printf("%c",word[0]);

我不知道如何使它工作。

让我们从基础开始。您在编写时声明的内容:

char word[]=i;
是一个字符数组,将根据
=
符号右侧的内容进行初始化。在本例中,指向
i
,这是一个单个字符(尽管从技术上讲,这是一个无效的初始值设定项)。因此,实际上,您正试图声明一个大小为
1
的字符数组

如果允许的话,
word
将不会是字符串,因为它不是(也不能)以
null结尾的
。它只是char类型的数组,不能用作字符串。(注意
char-word[]=“i”;
将起作用-并以null结尾)

当您将
word
声明为:

char *word=i;
您创建了一个指向char类型的指针,该指针被错误地初始化为保存
i
的内存地址

(指针仅包含存储在内存中的其他内容的地址作为其值,在这种情况下,您已将该地址设置为
i
的值,该值可能在系统保留的内存范围内,并可能导致立即分段故障

你可能想要的是:

char *word=&i;
您将
i
的地址存储为word的值。虽然这将为您提供指向
i
的字符指针,但除了涉及指针之外,它与动态分配无关

要正确地动态分配
word
,您仍然需要创建名为
word
的指针,但随后需要分配
word
将指向的内存块。(指向该内存块的起始地址)。因此,要为
word
动态分配空间,您可能会看到如下内容:

char *word = NULL;            /* initialization to NULL is good practice */
word = malloc (numbytes * sizeof *word); /* allocate numbytes of storage */
然后有一个指针
word
,其值是新内存块的起始地址(
numbytes x sizeof*word
)字节。(因为
sizeof*word
只是
sizeof(char)
的值是
1
),所以您创建了一个大小为
numbytes
的内存块

对于该内存块,您有两项责任:(1)必须保留指向该块起始地址的指针;因此(2)当不再需要时,您可以
释放
内存。(1)表示代码中没有
word++;,等等。
。如果需要迭代指针值,请创建指针,例如:

char *p = word;
然后可以在
p
上使用指针算法,而不影响
word
的值

然后,您可以按照自己喜欢的方式填充单词,只要在末尾留出空终止符的空间(如果您要将其用作字符串),并且不尝试向其写入超过
numbytes
的数据

因此,在您的情况下,如果您的目的是动态分配
word
来保存要打印为字符串的字符
i
,那么您可以轻松地执行以下操作:

char *word = NULL;

word = malloc (10 * sizeof *word);
if (!word) {  /* always validate each allocation */
    fprintf (stderr, "error: virtual memory exhausted.\n");
    return 1;
}

if (scanf ("9%s", word))
    printf ("word contains '%s'\n", word);

free (word);
注意:当使用
scanf(“9%s”,word)
时,您将在遇到第一个空格后立即停止读取。您可能需要使用
scanf(“9%[^\n]]*c,word)
,它的基本意思是
%9[^\n]
最多读取9个字符(不包括
\n
),然后
%*c
读取并丢弃换行符,而不将其添加到
scanf
返回的匹配计数中。因此,您的测试:

if (scanf ("9%s", word))
确保
scanf
已将至少一个字符作为字符串(空终止字)读入
word
成功读取时,将其添加到
scanf
的匹配计数中,使
match count=1
。然后
scanf
返回匹配计数,确保仅在成功读取后才打印

另请注意:通过在格式字符串中包含宽度说明符
%9s
(或
%9[^\n]
),将要读取的字符数
scanf
限制为
9
。这可以确保您不能写入超出分配给word的内存末尾的内容,同时确保可用空间以null终止字符串

另一个缺点。如果您希望用户输入数据,则提示用户输入数据,这样用户就不会看到屏幕上闪烁的光标,怀疑程序是否挂断等等。将所有这些放在一个简短的示例中

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

int main (void) {

    char *word = NULL;

    word = malloc (10 * sizeof *word);
    if (!word) {  /* always validate each allocation */
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }

    printf ("\nEnter up to 9 characters to store in 'word': ");
    if (scanf ("%9[^\n]%*c", word))
        printf ("word contains '%s'\n", word);

    free (word);

    return 0;
}
如果您有任何问题,请告诉我。

可能的副本
$ ./bin/dynalloc

Enter up to 9 characters to store in 'word': dog
word contains 'dog'

$ ./bin/dynalloc

Enter up to 9 characters to store in 'word': 1234567890
word contains '123456789'

$ ./bin/dynalloc

Enter up to 9 characters to store in 'word': my dog
word contains 'my dog'