c - 使用 extern 重新分配

标签 c extern realloc

您好,我正在尝试弄清楚如何使用 realloc。我做了一个小测试项目,我试图 malloc 以创建 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]);
}
}

解析.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

最佳答案

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

虽然重新分配使用原始指针变量以外的另一个指针变量,但在失败的情况下您不会丢失对旧内存的引用。

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

不要强制转换 malloc 的返回值。

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

您还应该将外部声明放在main.c 中。您向 parseInput 函数传递了错误数量的参数。代码没有编译。

然后在更正输入后 - 如果您尝试,您可能会遇到段错误或一些类似的错误。

我已经尝试在这里演示一些东西。命名可以更好。我试图保留您所尝试的一般方面。使用和测试了多个带有 realloc 的源文件,使用指针等。

主.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;

    }

解析.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;
    }

我的标题.h

    extern int* parseInput(int *,int );

编译运行

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

关于c - 使用 extern 重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47842042/

相关文章:

c - 用 C 实现类

c - C 中 extern 关键字的行为

c++ - 将 main 声明为 extern "C"是否合法 C++?

C - 更改结构中的成员时出现重新分配错误

c - 在 C 中使用 Realloc 的字符串

混淆使用 libbz2 功能?任何人都可以向我解释这是对还是错?

c++ - 用于 C++ 的嵌入式调试器

c - 在 UNIX 域套接字上设置 connect() 超时

c - 同名的两个静态变量(两个不同的文件)和外部其中一个在任何其他文件中

c - realloc() 无效的旧大小