1

C を読み始めたばかりですが、man ページを読みましたが、適切な答えが見つかりませんでした。したがって、コードは以下のとおりです

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

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

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

for loop前にも memset できます。

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

あなたのプログラムの間違いは

void *realloc(void *p, 20*sizeof(int));1)このステートメントが関数呼び出しのように見えないため、コンパイル エラー 。

2) for (int i = 0; i < 21; i++)- メモリが20要素に再割り当てされた後、最大 までしかアクセスできません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 に答える
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 に答える