代码之家  ›  专栏  ›  技术社区  ›  Mattia Surricchio

使用realloc将指针数组初始化为空,无需迭代

  •  0
  • Mattia Surricchio  · 技术社区  · 6 年前

    是否可以自动初始化为空重新分配的数组中的指针 realloc 不需要迭代吗?我想做一些像 calloc 但是我需要调整一个已经存在的内存块。

    例如 :

    #DEFINE N  50
    typedef int *pointerToInt;
    typedef pointerToInt *pointerToPointer;
    int main(){
       pointerToInt p;
       pointerToPointer pp;
       pp = malloc(sizeof(p)*N);
       //Now i want to resize and initialize my resized vector
       pp = realloc(pp, sizeof(p)*(N+10));
    }
    

    在第一次近似下,我可以改变 malloc 分配 ,但当我使用 重新分配 没有什么可以保证我初始化了指针。

    是否需要遍历整个数组并将每个指针设置为空?或者有更好的方法 分配 重新分配 ?

    2 回复  |  直到 6 年前
        1
  •  4
  •   chqrlie    6 年前

    简而言之,答案是: ,没有重新分配内存块并将其新分配部分初始化为所有位零的标准函数。

    解决方案是:

    • 通过跟踪数组的有效部分不需要初始化。显然,您必须有一种方法来实现这一点,否则您将如何决定重新分配对象。
    • 显式初始化新分配的部分。

    代码中有几个问题:

    • #DEFINE N = 50 不正确,应该是 #define N 50
    • 在typedef后面隐藏指针是不好的:它会使代码变得模糊和容易出错。做两次是邪恶的。
    • 你没有包括 <stdlib.h>
    • 你不测试 malloc 失败
    • 您没有初始化由 malloc() 或者。

    以下是修改版本:

    #include <stdlib.h>
    
    #define N 50
    
    int main(void) {
        int i;
        int **pp, **pp1;
        pp = malloc(sizeof(*pp) * N);
        if (pp) {
            for (i = 0; i < N; i++) {
                pp[i] = NULL;
            }
            //Now I want to resize and initialize my resized vector
            pp1 = realloc(pp, sizeof(*pp) * (N + 10));
            if (pp1) { 
                pp = pp1;
                for (i = N; i < N + 10; i++) {
                    pp[i] = NULL;
                }
            }
            free(pp);
        }
        return 0;
    }
    

    请注意,您可以为自己的目的编写实用程序函数:

    #include <stdlib.h>
    #include <string.h>
    
    void *realloc_zero(void *p, size_t size, size_t new_count, size_t count, int *err) {
        void *newp;
        if (p == NULL)
            count = 0;
        newp = realloc(p, size * new_count);
        if (newp == NULL) {
            *err = 1;
            return p;
        } else {
            if (new_count > count) {
                memset((unsigned char*)newp + size * count, 0, size * (new_count - count));
            }
            *err = 0;
            return newp;
        }
    }
    
    #define N 50
    
    int main(void) {
        int err;
        int **pp;
        pp = calloc(sizeof(*pp), N);
        ...
        //Now I want to resize and initialize my resized vector
        pp = realloc_zero(pp, sizeof(*pp), N + 10, N, &err);
        if (err) {
            // could not resize
            free(pp);
            return 1;
        }
        ...
        free(pp);
        return 0;
    }
    

    不过,请注意 calloc realloc_zero 将块初始化为所有位零,这是C标准不能保证的 NULL ,尽管大多数当前的体系结构确实以这种方式表示空指针。

        2
  •  1
  •   Thomas Padron-McCarthy    6 年前

    不,没有自动的方法。必须迭代并设置每个未初始化的指针。