【问题标题】:Declaring arraz with dynamic content用动态内容声明数组
【发布时间】:2016-02-01 00:22:12
【问题描述】:

我想制作一个程序,它会说出单词中有多少个大小写字母等等,但是遇到了我不能动态声明数组内容的问题。这都是C代码。 我试过这个:

char something;
scanf("%c",somethnig);
char somethingmore[]=something;
printf("%c",something[0])

但无法编译我也尝试过这样的事情:

char *something;
scanf("%c",something);
printf("%c",something[0]);

这是可以编译的,但在调用数组指针时会崩溃(如果命名错误,我深表歉意)我是初学者,所以这可能是个愚蠢的问题。 这只是我运行的问题的示例,而不是我的程序代码。

【问题讨论】:

  • 了解内存分配。
  • 为了扫描一个字符串,你不能使用%c,因为那只会扫描一个字符。你应该改用%s
  • char somethingmore[]=something; 你不能以这种方式为字符串赋值。
  • 我已经知道了,我的问题是我该怎么做?

标签: c arrays variables char declaration


【解决方案1】:

好吧,不管你的 sn-p 中奇怪的错误语法,我认为一个好的答案可以提醒你一件事:

C 不会为您做任何内存管理

或者,换句话说,必须明确地管理内存。因此,数组在 C 中具有固定大小(必须在编译时知道,因此编译器可以在二进制文件中保留适当的空间,通常在 数据段 中,或在堆栈中为 本地变量)。

一个值得注意的例外是 中的可变长度数组,但即使使用它们,数组的大小也只能设置一次——在初始化时。是否认为这是一个伟大的事情或只是一个错误的功能是一个品味问题,但它不会解决您在运行时更改大小的问题。

如果你想动态增长一些东西,只有一个选择:让它成为一个分配的对象并自己管理内存,使用函数malloc()calloc()realloc()free()。所有这些函数都是标准 C 的一部分,因此您应该阅读它们。典型用法(与您的问题无关)如下所示:

#include <stdlib.h>

int *list = 0;
size_t capacity = 0;
size_t count = 0;

void append(int value)
{
    if (capacity)
    {
        if (count == capacity)
        {
            /* reserve more space, for real world code check realloc()
             * return value */
            capacity *= 2;
            list = realloc(list, capacity * sizeof(int));
        }
    }
    else
    {
        /* reserve an initial amount, for real world code check malloc()
         * return value */
        capacity = 16;
        list = malloc(capacity * sizeof(int));
    }

    list[count++] = value;
}

这非常简单,您可能会将容器定义为struct,其中包含指向“数组”的指针以及容量和计数成员,并在某些实际代码中定义在该结构上工作的函数。或者您可以去使用库中的预定义容器,例如glib.

【讨论】:

  • 好的,我知道如何做我想做的事,谢谢大家
猜你喜欢
  • 2023-02-09
  • 2017-10-26
  • 2019-12-16
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多