标签: realloc

如何在C中读取无限字符

如何在char*不指定大小的情况下将无限字符读入变量?

例如,假设我想要读取也可能需要多行的员工的地址.

c input realloc dynamic-memory-allocation

5
推荐指数
1
解决办法
5460
查看次数

如何为我的C结构数组分配更多空间?

我正在尝试向我的结构添加10个元素,这个元素已经是malloc,其大小为20,这就是我定义结构的方式:

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

struct st_temp {
   char *prod;
};

int main ()
{
   struct st_temp **temp_struct;

   size_t j;
   temp_struct = malloc (sizeof *temp_struct * 20);
   for (j = 0; j < 20; j++) {
      temp_struct[j] = malloc (sizeof *temp_struct[j]);
      temp_struct[j]->prod = "foo";
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想到的是重新分配(但是,不知道如何):

temp_struct = (struct st_temp **) realloc (st_temp, 10 * sizeof(struct st_temp*));
Run Code Online (Sandbox Code Playgroud)

然后添加额外的10个元素,

   for (j = 0; j < 10; j++)
      temp_struct[j]->prod = "some extra values";
Run Code Online (Sandbox Code Playgroud)

我怎么能实现这个目标?任何帮助表示赞赏!

c malloc struct realloc

5
推荐指数
2
解决办法
9298
查看次数

memcpy()是否使用realloc()?

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

int main() {
    char *buff = (char*)malloc(sizeof(char) * 5);
    char *str = "abcdefghijklmnopqrstuvwxyz";

    memcpy (buff, name, strlen(str));

    while(*buff) {
        printf("%c" , *buff++);
    }

    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码打印整个字符串"abc ... xyz".但是"buff"没有足够的内存来容纳那个字符串.memcpy()如何工作?它使用realloc()吗?

c buffer memcpy realloc

5
推荐指数
2
解决办法
7842
查看次数

如果目的地和来源相同,那么memmove会做什么?

如果目的地和来源相同,memmove仍然"移动"数据(或直接返回)?那怎么样realloc; 如果新尺寸与旧尺寸相同怎么办?

c realloc memmove

5
推荐指数
1
解决办法
1695
查看次数

realloc:glibc检测到的下一个大小无效

我的代码:

int args_size = 5;
char** args;

args = (char**) malloc(sizeof(char*) * args_size);

// ...

args = (char**) realloc(args, sizeof(char*) * (args_size += 5));

我想把尺寸增加5.

但我得到这个错误:

*** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000000a971c0 ***

我知道一个临时变量捕获realloc是好的,但只是为了简单...

c size realloc dynamic-arrays

5
推荐指数
1
解决办法
9311
查看次数

在重新分配时始终建议使用std :: vector是否公平?

来自Bjarne Stroustrup的常见问题解答

如果您觉得需要realloc()-而且很多人都这样做-那么请考虑使用标准库向量。

我将通过同意std::vector更好的原因(因为许多原因)来开始我的问题,而我个人总是选择使用它,而不是使用C内存分配编写自己的动态数组。

但是std::vector由于C ++没有等效的内存,内存会随着内存的增长而碎片化realloc编辑澄清一下,我知道std::vectors的存储是连续的,不会碎片化,我的意思是分配和取消分配导致的内存空间碎片化,这realloc可以避免扩展现有分配)。那么总是推荐它公平realloc吗?小心翼翼,难道您不能编写类似于std::vectorC分配函数那样工作的东西,它可以在不移动其地址和复制现有元素的情况下增加其内存,使其在碎片和性能方面都达到或超过或提高吗?

与此相关的(奖励问题!),为什么 C ++没有与之等效的东西realloc?忽略一种专注于性能的语言,这似乎很奇怪。Bjarne的FAQ中的部分恰好具有该标题(没有强调),但是答案并未解决“为什么”的问题。只是偶然的遗漏吗?是否有与如何一些基本的不相容new/ delete工作?它真的不能真正带来实际的好处吗?

编辑:好的,所以我忽略了C的复杂性realloc- std::vector不能使用重写,realloc因为它仅适用于POD,不抛出等。在某些情况下,也许编写一个仅用于POD的容器来处理棘手问题是个好主意。无论如何,更有趣的问题变为:将std::vector受益于C ++的等价物realloc,它在(或多或少)已经在这里得到了回答:

当容量增加时std :: vector是否具有移动对象的能力?或者,分配器可以“重新分配”吗?

可悲的是,答案似乎是“是,但是标准委员会没有投票赞成”。希望如此

c++ realloc

5
推荐指数
2
解决办法
2248
查看次数

动态数组:使用realloc()而不会出现内存泄漏

我使用realloc来调整分配的内存:

char **get_channel_name(void)   
{
    char **result;
    int n;

    result = (char **) 0;
    for (elem = snd_mixer_first_elem(handle), n = 0; elem; elem = snd_mixer_elem_next(elem)) {
        if (!snd_mixer_selem_is_active(elem))
            continue;
        if (snd_mixer_selem_has_playback_volume(elem) &&
            snd_mixer_selem_has_playback_switch(elem) &&
            snd_mixer_selem_has_capture_switch(elem)) {
            if (result == (char **) 0)
                result = (char **) malloc(sizeof(char *));
            else
                result = (char **) realloc(result, sizeof(char *) * (n + 1)); /* nulled but not freed upon failure */
            result[n++] = strdup(snd_mixer_selem_get_name(elem));
        }
    }

    if (result == (char **) 0)
        return NULL; …
Run Code Online (Sandbox Code Playgroud)

c realloc cppcheck

5
推荐指数
1
解决办法
2658
查看次数

当你有一个指向结构指针的指针时,如何使用realloc?

我有这个结构数组,这个函数接受一个指向数组指针的指针.原始大小为2,所以每当达到大小时,我需要重新分配并加倍大小.当这段代码运行时,我从realloc中得到一个无效的旧大小错误.我究竟做错了什么?

  int PopulateArray(struct Inventory **inv, int *size, FILE *inputFile) {
    int count = 0;
    printf("address: %u\n", inv);
    printf("address: %u\n", **inv);
    int itemNumber;
    int quantity;
    float price;
    int month;
    int year;
    while (fscanf(inputFile, "%i %i %f %i/%i", &itemNumber,
    &quantity, &price, &month, &year) != EOF) {
      (*inv)->itemNumber = itemNumber;
      (*inv)->quantity = quantity;
      (*inv)->price = price;
      (*inv)->expDate.month = month;
      (*inv)->expDate.year = year;
      printf("count: %i  size: %i\n", count, *size);

      if (count == *size - 1) {
        inv = realloc(inv, (*size * 2 * sizeof(struct …
Run Code Online (Sandbox Code Playgroud)

c pointers realloc

5
推荐指数
1
解决办法
196
查看次数

std :: vector的性能不好是因为没有调用realloc的对数次?

编辑:我添加了两个基准,比较realloc与C数组的使用和reserve()与std :: vector的使用.从最后的分析来看,似乎realloc影响很大,即使只调用了30次.检查文档我想这是因为realloc可以返回一个全新的指针,复制旧的指针.为了完成该场景,我还添加了用于在初始化期间完全分配阵列的代码和图形.区别reserve()是有形的.

编译标志:只有图中描述的优化,用g ++编译,仅此而已.

原始问题:

std::vector当我添加10亿个整数并且第二个代码比使用向量的代码快得多时,我做了vs新/删除数组的基准测试,尤其是在启用优化的情况下.

我怀疑这是由内部调用realloc的向量太多次引起的.如果vector每次填充时它的大小不会增加一倍就会出现这种情况(这里数字2没有什么特别之处,重要的是它的大小几何增长).在这种情况下,对realloc的调用只会O(log n)代替O(n).

如果这是导致第一个代码缓慢的原因,我怎么能告诉std :: vector几何增长?

请注意,调用reserve一次会在这种情况下工作,但不是在更普遍的情况下,事先不知道push_back的数量.

在此输入图像描述

黑线

#include<vector>

int main(int argc, char * argv[]) {
    const unsigned long long size = 1000000000;

    std::vector <int> b(size);
    for(int i = 0; i < size; i++) {
        b[i]=i;
    }    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

蓝线

#include<vector>

int main(int argc, char * argv[]) {
    const int size = 1000000000;    
    std::vector <int> b;
    for(int i = 0; i < size; i++) { …
Run Code Online (Sandbox Code Playgroud)

c++ performance benchmarking vector realloc

5
推荐指数
3
解决办法
926
查看次数

如何在C标准库中实现realloc?

我找不到该realloc函数的任何源代码,而且似乎破坏了C的基本规则:它不需要花很长时间重新分配内存。

  1. 在不知道原始内存长度的情况下如何重新分配内存?

  2. 我如何自己实现此功能?

c realloc

5
推荐指数
1
解决办法
143
查看次数