首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >真正的指针,在哪里说‘这是一个指针’?

真正的指针,在哪里说‘这是一个指针’?
EN

Stack Overflow用户
提问于 2022-05-28 14:51:35
回答 1查看 45关注 0票数 0

我使用realloc有一个问题。我无法实现一系列int。

既然realloc已经修复,我唯一的问题就是我无法触发for。现在是这样的:

代码语言:javascript
复制
int insereAIndice(int* Tab, int index, int insertion, int taille) {
    Tab = realloc(Tab, taille * sizeof (*Tab));
    int i;
    for (i = taille-1; i <= index+1 ; i--) {
        printf("%d", Tab[i]);
        Tab[i] = Tab[i-1];
    }
    return *Tab;
}

以下是“重要”一行:

代码语言:javascript
复制
*Tab = realloc(*Tab, taille * sizeof (*Tab));

下面是代码的其余部分:

Main.c

代码语言:javascript
复制
#include "functions.h"
#include "functions.c"

/*       TP 3 - ESIEE-IT Rémy JARDIN        */

int main() {
    int saisie, index, insertion, taille;


    // Création du tableau avec des valeurs aléatoires.
    printf("Creation du Tableau. \nNombre de caractere du tableau : ");
    scanf("%d", &saisie);

    int *Tab = ArrayCreate(saisie);

    printf("Voici le tableau nouvellement creer : \n");
    Affichage(Tab, saisie);


    // Insertion d'une valeur 'insertion' à l'index 'index'. Avec décallage.
    taille = saisie;

    printf("\n ! Mode Insertion ! \nNouvel Endroit souhaiter a partir de 0 : ");
    scanf("%d", &index);

    printf("Nouvelle valeur souhaiter : ");
    scanf("%d", &insertion);

    insereAIndice(Tab, index, insertion, taille);
    Affichage(Tab, saisie);
 
    free(Tab);
    return 0;
}

functions.h

代码语言:javascript
复制
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

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

int *ArrayCreate(int saisie);
int randomizer(void);
int insereAIndice(int* Tab, int index, int insertion, int taille);
int Affichage(int* Tab, int max);

#endif

functions.c

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include "functions.h"


int *ArrayCreate(int saisie) {
    int i;
    int *Tab = malloc( saisie * sizeof (*Tab));
    if (Tab==NULL) {
        printf("Not enough Memory");
        exit (1);
    }
    for (i = 0; i < saisie; i++) {
        Tab[i] = randomizer();
    }
    return Tab;
}


int randomizer() {
    return 1 + rand() % 100;
}


int insereAIndice(int* Tab, int index, int insertion, int taille) {
    *Tab = realloc(*Tab, taille * sizeof (*Tab));
    int i;
    for (i = taille; i < index ; i--) {
        printf("\n - %d", Tab[i]);
    }
    return *Tab;
}


int Affichage(int* Tab, int max) {
    // Affichage
    int i;
    printf("\n Resultats : ");
    for (i = 0; i < max; i++) {
        printf("%d - ", Tab[i]);
    }
    return *Tab;
}

这就是GCC给我的:

代码语言:javascript
复制
functions.c: In function 'insereAIndice':
functions.c:26:20: warning: passing argument 1 of 'realloc' makes pointer from integer without a cast [-Wint-conversion]
     *Tab = realloc(*Tab, taille * sizeof (*Tab));
                    ^
In file included from functions.h:5:0,
                 from main.c:1:
f:\logiciel\mingw\include\stdlib.h:486:40: note: expected 'void *' but argument is of type 'int'
 _CRTIMP __cdecl __MINGW_NOTHROW  void *realloc (void *, size_t);
                                        ^~~~~~~
In file included from main.c:2:0:
functions.c:26:10: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     *Tab = realloc(*Tab, taille * sizeof (*Tab));
          ^

谢谢!

EN

Stack Overflow用户

回答已采纳

发布于 2022-05-28 14:55:54

realloc的第一个参数是指针。Tab被声明为int *,因此这意味着*Tab是一个int,这就是为什么它不匹配参数的类型。这也意味着返回类型与您要分配给它的内容不匹配。

因此,传递指针,而不是它所指向的。

代码语言:javascript
复制
Tab = realloc(Tab, taille * sizeof (*Tab));

但在以下几行中,另一个问题变得明显起来:

代码语言:javascript
复制
for (i = taille; i < index ; i--) {
    printf("\n - %d", Tab[i]);
}

数组的大小已经调整为有taille元素,因此这个循环读取超过分配内存的结束。您可能希望这样做,而不是用于分配:

代码语言:javascript
复制
Tab = realloc(Tab, index * sizeof (*Tab));

因此,您不再读取过去分配的内存(假设数组被调整为更大的大小),但是现在您正在读取未初始化的值。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72416647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档