在没有迭代的情况下使用 realloc 将指针数组初始化为 NULL
Initialize array of pointers to NULL with realloc without iteration
是否可以自动将用 realloc
重新分配的数组中的指针初始化为 NULL 而无需对其进行迭代?我想做类似 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
更改为 calloc
,但是当我使用 realloc
时,没有任何东西可以保证我初始化指针。
是否需要遍历整个数组并将每个单独的指针设置为 NULL?或者有更好的方法只使用 calloc
和 realloc
?
不,没有自动方式。您必须迭代并设置每个未初始化的指针。
简短的回答是:否,没有标准函数来重新分配内存块并将其新分配的部分初始化为所有位零。
解决方案是:
- 不需要通过跟踪数组的有效部分进行初始化。你显然必须有办法做到这一点,否则你将如何决定重新分配对象。
- 显式初始化新分配的部分。
你的代码有几个问题:
#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
的正确表示,尽管大多数当前的体系结构确实以这种方式表示空指针。
是否可以自动将用 realloc
重新分配的数组中的指针初始化为 NULL 而无需对其进行迭代?我想做类似 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
更改为 calloc
,但是当我使用 realloc
时,没有任何东西可以保证我初始化指针。
是否需要遍历整个数组并将每个单独的指针设置为 NULL?或者有更好的方法只使用 calloc
和 realloc
?
不,没有自动方式。您必须迭代并设置每个未初始化的指针。
简短的回答是:否,没有标准函数来重新分配内存块并将其新分配的部分初始化为所有位零。
解决方案是:
- 不需要通过跟踪数组的有效部分进行初始化。你显然必须有办法做到这一点,否则你将如何决定重新分配对象。
- 显式初始化新分配的部分。
你的代码有几个问题:
#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
的正确表示,尽管大多数当前的体系结构确实以这种方式表示空指针。