创建数组的动态声明

我想要动态声明的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' 

如果您有任何疑问,请告诉我。