Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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_Resize - Fatal编程技术网

在C语言中调整数组大小

在C语言中调整数组大小,c,arrays,resize,C,Arrays,Resize,假设我分配了一个数组,如下所示: char* array[]={"This"}; 后来我想给array[]分配一个新值,这样它就可以存储“This”和“that”,有没有一种方法可以改变array的大小,这样它就可以保存新数量的值?不,你不能改变array的大小。您可以根据需要使用动态分配的char*列表和realloc(): #include <stdlib.h> #include <string.h> #include <stdio.h> int ma

假设我分配了一个数组,如下所示:

char* array[]={"This"};

后来我想给array[]分配一个新值,这样它就可以存储“This”和“that”,有没有一种方法可以改变array的大小,这样它就可以保存新数量的值?

不,你不能改变array的大小。您可以根据需要使用动态分配的
char*
列表和
realloc()

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

int main()
{
    char** array = malloc(1 * sizeof(*array));

    if (array)
    {
        array[0] = "This";

        printf("%s\n------\n", array[0]);

        char** tmp = realloc(array, 2 * sizeof(*array));
        if (tmp)
        {
            array = tmp;
            array[1] = "That";

            printf("%s\n", array[0]);
            printf("%s\n", array[1]);
        }

        free(array);
    }
    return 0;
}
#包括
#包括
#包括
int main()
{
字符**数组=malloc(1*sizeof(*数组));
if(数组)
{
数组[0]=“此”;
printf(“%s\n-----\n”,数组[0]);
字符**tmp=realloc(数组,2*sizeof(*数组));
如果(tmp)
{
阵列=tmp;
数组[1]=“That”;
printf(“%s\n”,数组[0]);
printf(“%s\n”,数组[1]);
}
自由(数组);
}
返回0;
}

请参阅联机演示:。

无法调整阵列的大小。您只需创建一个大小为2的新数组,然后将前一个数组中的所有数据复制到新数组中
realloc
使用动态内存为您实现这一点。更好的方法是使用数据结构,如
链接列表
向量
,您可以在网上找到更多信息。

这是不可能的。您可以分配char*数组,但:

char **array = calloc(2, sizeof(char *));
array[0] = "This";
array[1] = "That";

不能调整阵列对象的大小

您必须为
array
动态分配内存,并使用
realloc
扩展它。例如:

size_t current_size = 0;

char **array = malloc((current_size + 1) * sizeof *array);
if (array)
{
  array[current_size++] = "This";
}
...
/**
 * If realloc cannot extend the buffer, it will return NULL and leave
 * the original buffer intact; however, if we assign NULL back to array,
 * we lose our handle to the original buffer, causing a memory leak, so
 * we assign the result to a temporary variable.
 */
char **tmp = realloc(array, (current_size + 1) * sizeof *array)
if (tmp)
{
  array = tmp;
  array[current_size++] = "That";
}
else
{
  // realloc failed to extend the buffer; original buffer
  // is left intact.
}
注意事项:

realloc
是一个相对昂贵的调用,因此您(通常)不希望像我在这里做的那样一次扩展一个缓冲区元素。更常见的策略是选择一个覆盖大多数情况的初始起始大小,如果需要扩展缓冲区,则将其大小加倍

您可以将调整大小操作抽象为单独的函数,如下所示:

int addItem(char ***arr, char *newElement, size_t *count, size_t *bufSize)
{
  if (*count == *bufSize)
  {
     // we've run out of room; extend the buffer
     char **tmp = realloc(**arr, 2 * *bufSize * sizeof **arr);
     if (tmp)
     {
       *arr = tmp;
       *bufSize *= 2;
     }
     else
     {
       // could not extend the buffer; return failure code
       return 0;
     }
  }
  (*arr)[(*count)++] = newElement;
}
并称之为

#define N ... // initial array size

char **array = malloc(N * sizeof *array);
size_t bufSize = N;
size_t count = 0;
...
if (addItem(&array, "This", &count, &bufSize))
  printf("# elements = %zu, buffer size = %zu\n", count, bufSize);

if (addItem(&array, "That", &count, &bufSize))
  printf("# elements = %zu, buffer size = %zu\n", count, bufSize);

这一切都是未经测试的,而且是我脑子里想不出来的;没有明示或暗示的保证。但这应该足以为你指明正确的方向

您可以使用VLA,但即使阵列的大小在运行时可能会有所不同,但一旦创建了阵列,您也无法更改其大小(直到它被销毁并重新创建)。请注意,您在此处声明了二维阵列。我不确定那是你的意图?@harald:那不是二维数组(可能问题在你的评论之后,但在编辑窗口关闭之前被改变了)。@SteveJessop,从技术上说你是对的。这是一个指向字符的指针数组,但它被初始化为一个指向字符串的指针数组(带有一个元素)。虽然这可能是他想要的,但从这个问题上看有点不清楚。@harald:我认为这是他想要的(只是数组变量不能满足他的要求)。他从一个指针数组开始(指向
“This”
),然后他想要一个两个指针数组(一个指向
“This”
,一个指向
“That”
)。@SteveJessop,看起来你是对的:)也会帮助添加一个特定的代码示例,依我看。