1

我刚刚开始 C 阅读手册页,但找不到正确的答案。所以代码如下

void *p = malloc(10*sizeof(int));
int *q = p;
int NUMOFINT = 10;
for (int i = 0; i < NUMOFINT; i++){
printf("%i ", q[i]);
}
void *realloc(void *p, 20*sizeof(int));
for (int i = 0; i < 21; i++){
printf("%i ", q[i]);

它给出了这个错误:

malloc.c: In function ‘main’:
malloc.c:31:24: error: expected declaration specifiers or ‘...’ before numeric constant

我不太明白大小格式对于 realloc 是可以的,malloc()但对于 realloc 是不行的。那么我该如何纠正错误呢?

编辑:

所以当我把它变成:

void *morep = realloc(p, 20*sizeof(int));
int *q2 = morep;
for (int i = 0; i < 20; i++){
printf("%i ", q2[i]);
}

它打印q2[11]135121

4

3 回答 3

0

这个

void *realloc(void *p, 20*sizeof(int));

是错的。你要

p = realloc(p, 20*sizeof(int));

顺便说一句,这一行也是一个问题(但会编译得很好):

for (int i = 0; i < 21; i++){

您将 p 分配给 20*sizeof(int) 字节,因此元素 20 超出了数组的末尾。你要:

for (int i = 0; i < 20; i++){
于 2012-08-15T18:36:27.247 回答
0

realloc可以尝试扩展堆中的现有内存块,如果不可能,它将为新大小分配一个新的单独内存块,并将数据从旧内存块复制到新内存块。

因此,如果 realloc 返回的地址与p然后它只是扩展旧的内存块相同。否则我们必须释放旧的内存块并开始使用realloc.

#define NUMOFINT 10
#define NUMOFINT_NEW 20

void *p = malloc(NUMOFINT * sizeof(int)); 
int *q = p; 
void *temp = NULL;

for (int i = 0; i < NUMOFINT; i++)
{ 
    printf("%i ", q[i]); 
} 

temp = realloc(p, NUMOFINT_NEW * sizeof(int)); 
if (temp == NULL)
{
    exit(0);
}
else if (temp != p)
{
    free(p);
    p = temp;
}

//else temp is equal to p

for (int i = 0; i < NUMOFINT_NEW; i++)
{ 
    printf("%i ", q[i]); 
}

这里q[0]toq[9]0, 1, 2..9分配值(),其余的(q[10]to q[19])将具有垃圾值。我们还没有memset新分配的内存0

你也可以在memset之前for loop

memset((q + NUMOFINT), 0, (NUMOFINT_NEW - NUMOFINT));

您的程序中的错误是

1) 编译错误,因为 void *realloc(void *p, 20*sizeof(int));该语句看起来不像函数调用。

2) for (int i = 0; i < 21; i++)- 内存重新分配给20元素后,您只能访问 upto 19th,访问20th可能会导致崩溃(未定义的行为)。

3) it prints out q2[11] as 135121- 新分配的内存既不memset分配0也不分配任何有意义的值。

于 2012-08-17T11:29:55.510 回答
0
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>

int main(int argc, char **argv)
{
        int *temp;  /* To use with realloc, it's more secure */
        void *p = malloc(10*sizeof(int));
        int *q = p;
        int NUMOFINT = 10;

        /* dont forget to compile with -std=99 flag, if you use this kind of for loop */
        for (int i = 0; i < NUMOFINT; i++){
                printf("%i ", q[i]);
        }
        printf("\n");

        /* It's more secure to use this kind of realloc */
        temp = realloc (p, 20 * sizeof(int) );
        if (temp == NULL)
        {
                fprintf(stderr,"Reallocation failed --> %s\n", strerror(errno));
                free(p);

                exit(EXIT_FAILURE);
        }
        else
        {
                p = temp;
        }

        /* Zeroing after realloc */
        for (int i = NUMOFINT; i < 21; i++)
                q[i] = 0;

        for (int i = 0; i < 21; i++)
        {
                printf("%i ", q[i]);
        }
        printf("\n");

        return 0;
}
于 2012-08-15T18:41:19.693 回答