创建数组的动态声明
我想要动态声明的make数组我想象像这样的somethnig。我想要make程序识别单词中的字符。
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-terminated
。 它只是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
为( numbytes x sizeof *word
)字节的新内存块的起始地址。 (因为sizeof *word
只是sizeof (char)
其值为1
)。 因此,您已经创建了一个大小为numbytes
的内存块。
关于该内存块,您有两个责任(1)您必须保留指向该块起始地址的指针; 所以(2)你可以在不再需要时free
内存。 (1)在你的代码中没有word++;, etc..
。 如果需要迭代指针值,请创建一个指针,例如:
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
其添加到scanf
的匹配计数中 ,使match count = 1
。 然后scanf
返回匹配计数,确保您只在成功读取后打印。
另请注意:通过在格式字符串中包含宽度说明符%9s
(或%9[^\n]
),将读取的字符scanf
的数量限制为9
。 这可以确保您无法在分配给word的内存结束时写入,同时保证可用于空终止字符串的空间。
另一个人。 如果您希望用户输入数据,然后提示用户输入数据,那么用户不会在屏幕上看到闪烁的光标,想知道程序是否挂起等等。将所有这些放在一起在一个简短的例子中。
#include #include 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'
如果您有任何疑问,请告诉我。