您好,我正在尝试弄清楚如何使用 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/