在 c 中实现我自己的 realloc 函数
implementation of my own realloc function in c
我在这里尝试编写自己的 realloc 函数,但我坚持将旧数组复制到新数组。
如果一个文件每行仅包含 16 个或更少的字符串,这没有问题。当行超过原始设置 16 时会出现问题。这意味着问题是指我认为我的 realloc 函数实现。在我的程序中,我设置了三个步骤来控制数组的变化。
我的想法是:
第一步:当文件行小于等于16时,赋值给new_array
第二步:当文件行等于17时,再malloc一次space。将旧数组复制到新数组并将当前行给最后一个 space
第三步:与第二步类似,但旧数组是之前的扩展数组。
目前,我正在努力弄清楚为什么它不起作用。当我的文件恰好有 17 行时,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
结果是
here start
1
2
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
17
The file 'foo' had 17 lines.
utitlityFunction.c
#include "utilityFunction.h"
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
char **extendArray(char **oldArray, int oldLen, int newLen){
char **newptr = malloc(newLen * sizeof (char*)); //updated here. No changed for result
// if(newptr == NULL){
// perror("Failed to allocate");
// exit(1);
// }
memcpy(newptr, oldArray, oldLen);
free(oldArray);
return newptr;
}
我的主要功能代码如下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utilityFunction.h"
int main(int argc, char**argv){
FILE *filename;
size_t len = 0;
char *line = NULL;
int index;
int countLine = 0, i = 0;
char** new_array = malloc(16 * sizeof(char*));
char** extended_array;
char* current_line;
for(index = 1; index < argc; index++){ //loop for all files name you input in the command line
filename = fopen(argv[index], "r");
if(filename == NULL){
printf("The file '%s' did not exist.\n", argv[index]);
}else{
while(getline(&line, &len, filename)!=EOF){
current_line = strdup(line);
if(new_array == NULL){
perror("Failed to allocate");
exit(1);
}
if(i<16){
new_array[i] = current_line;
}
else{
if(i==16){ //actually index 17
extended_array = extendArray(new_array, i, countLine);
extended_array[i] = current_line;
}else{
printf("aaa?\n");
extended_array = extendArray(extended_array, i, countLine);
extended_array[i] = current_line;
}
}
i++;
countLine++;
}
//mprintf("%s\n", extended_array[0]);
//mprintf("-->m%d\n", countLine);
printf("here start\n");
int j;
for(j = 0; j < countLine; j++){
printf("%s\n", extended_array[j]);
}
//print line result after end of file
printf("The file '%s' had %d lines.\n", argv[index], countLine);
}
}
}
我迷路了....
我认为你的问题来自memcpy。
void * memcpy (void * destination, const void * source, size_t num );
您需要在一次调用中 memcpy 选项卡的每个案例而不是 char** 。
试试看
我在这里尝试编写自己的 realloc 函数,但我坚持将旧数组复制到新数组。 如果一个文件每行仅包含 16 个或更少的字符串,这没有问题。当行超过原始设置 16 时会出现问题。这意味着问题是指我认为我的 realloc 函数实现。在我的程序中,我设置了三个步骤来控制数组的变化。
我的想法是:
第一步:当文件行小于等于16时,赋值给new_array
第二步:当文件行等于17时,再malloc一次space。将旧数组复制到新数组并将当前行给最后一个 space
第三步:与第二步类似,但旧数组是之前的扩展数组。
目前,我正在努力弄清楚为什么它不起作用。当我的文件恰好有 17 行时,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
结果是
here start
1
2
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
17
The file 'foo' had 17 lines.
utitlityFunction.c
#include "utilityFunction.h"
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
char **extendArray(char **oldArray, int oldLen, int newLen){
char **newptr = malloc(newLen * sizeof (char*)); //updated here. No changed for result
// if(newptr == NULL){
// perror("Failed to allocate");
// exit(1);
// }
memcpy(newptr, oldArray, oldLen);
free(oldArray);
return newptr;
}
我的主要功能代码如下。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utilityFunction.h"
int main(int argc, char**argv){
FILE *filename;
size_t len = 0;
char *line = NULL;
int index;
int countLine = 0, i = 0;
char** new_array = malloc(16 * sizeof(char*));
char** extended_array;
char* current_line;
for(index = 1; index < argc; index++){ //loop for all files name you input in the command line
filename = fopen(argv[index], "r");
if(filename == NULL){
printf("The file '%s' did not exist.\n", argv[index]);
}else{
while(getline(&line, &len, filename)!=EOF){
current_line = strdup(line);
if(new_array == NULL){
perror("Failed to allocate");
exit(1);
}
if(i<16){
new_array[i] = current_line;
}
else{
if(i==16){ //actually index 17
extended_array = extendArray(new_array, i, countLine);
extended_array[i] = current_line;
}else{
printf("aaa?\n");
extended_array = extendArray(extended_array, i, countLine);
extended_array[i] = current_line;
}
}
i++;
countLine++;
}
//mprintf("%s\n", extended_array[0]);
//mprintf("-->m%d\n", countLine);
printf("here start\n");
int j;
for(j = 0; j < countLine; j++){
printf("%s\n", extended_array[j]);
}
//print line result after end of file
printf("The file '%s' had %d lines.\n", argv[index], countLine);
}
}
}
我迷路了....
我认为你的问题来自memcpy。 void * memcpy (void * destination, const void * source, size_t num ); 您需要在一次调用中 memcpy 选项卡的每个案例而不是 char** 。 试试看