您好我想弄清楚如何使用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
答案 0 :(得分:1)
C是按值传递的。您应该返回指针值。否则原始的不变。因此从parseInput
返回变量的指针或传递地址并相应地更改它(在示例中未显示)。
虽然重新分配使用了另一个指针变量而不是原始变量,但如果失败,你就不会失去对旧内存的引用。
不要打印未初始化的值。 (在main()
)。
不要投放malloc
的返回值。
打印指针时执行此printf("%p",(void*)fileTest[1]);
。
另外你应该在main.c
中加上extern声明。您已将错误数量的参数传递给parseInput
函数。代码没有&#39;编译。
然后在更正输入后 - 如果您尝试那么可能会出现分段错误或类似错误。
我试过在这里展示一些东西。命名可以更好。我试图保持你所尝试的一般方面。使用和测试realloc
的多个源文件,使用指针等。
#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;
}
#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;
}
extern int* parseInput(int *,int );
编译并运行
gcc -Wall -Wextra -Werror main.c parse.c
./a.out