Realloc使用extern

时间:2017-12-16 02:36:07

标签: c extern realloc

您好我想弄清楚如何使用realloc。我做了一个小测试项目,试图在mall中创建第一个元素,然后在该位置添加一个数字,然后重新分配数组以容纳一个元素。

MAIN.C

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



int main(int argc, char *argv[]){
int i =0;
int *fileTest = (int*) malloc(sizeof(char * ));
int amtFiles=0;
for(i=0;i<3;i++){
parseInput(fileTest , amtFiles);
printf("%d", fileTest[1]);
}
}

parse.c

#include <stdlib.h>
#include "stddef.h";
#include <stdlib.h>


extern int parseInput(int *fileTest,int amtFiles){
printf("enter number");
scanf("%d",amtFiles);
fileTest = realloc(fileTest, (amtFiles * sizeof(char *)));

}

makefile

CC = gcc
CC_FLAGS = -g -ansi -pedantic -Wall -w
FILES = main.c parse.c 
OUT_EXE = Test2

build: $(FILES)
    $(CC) $(CC_FLAGS) -o $(OUT_EXE) $(FILES) 

clean:
    rm -f *.o core *.exe *~ 

rebuild: clean build

1 个答案:

答案 0 :(得分:1)

C是按值传递的。您应该返回指针值。否则原始的不变。因此从parseInput返回变量的指针或传递地址并相应地更改它(在示例中未显示)。

虽然重新分配使用了另一个指针变量而不是原始变量,但如果失败,你就不会失去对旧内存的引用。

不要打印未初始化的值。 (在main())。

不要投放malloc的返回值。

打印指针时执行此printf("%p",(void*)fileTest[1]);

另外你应该在main.c中加上extern声明。您已将错误数量的参数传递给parseInput函数。代码没有&#39;编译。

然后在更正输入后 - 如果您尝试那么可能会出现分段错误或类似错误。

我试过在这里展示一些东西。命名可以更好。我试图保持你所尝试的一般方面。使用和测试realloc的多个源文件,使用指针等。

的main.c

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


    int main(void)
    {
        int *fileTest = NULL;
        int amtFiles;
        int weTried = 2;
        while(weTried --> 0){
            printf("%s\n", "Enter the array size.\n");
            if( scanf("%d",&amtFiles) != 1){
                fprintf(stderr, "%s\n","Error in input" );
                exit(1);
            }
            else if( amtFiles <= 0){
                fprintf(stderr, "%s\n", "Enter positive integral value");
                exit(1);
            }
            fileTest = parseInput(fileTest, amtFiles);
            if( fileTest == NULL){
                fprintf(stderr, "%s\n","Realloc failed." );
                exit(1);
            }
            for(int i = 0; i < amtFiles; i++){
                printf("[%d]\n",fileTest[i]);
            }
        }
        return 0;

    }

parse.c

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

    int* parseInput(int *fileTest,int amtFiles)
    {
        if( amtFiles <= 0){
            fprintf(stderr, "%s\n", "Error in number of inputs");
            exit(1);
        }
        int *t = realloc(fileTest, (amtFiles * sizeof * t));
        if( t == NULL ){
            fprintf(stderr, "%s\n", "Execution exception");
            return NULL;
        }
        fileTest = t;
        for(int i = 0; i < amtFiles; i++){
            fileTest[i] = 2017+i;
        }
        return fileTest;
    }

myheader.h

    extern int* parseInput(int *,int );

编译并运行

gcc -Wall -Wextra -Werror main.c parse.c
./a.out