用户在函数dynamic_array
中输入字符串后动态扩展数组我的问题似乎是当我尝试在i dynamic_array
返回true之后在main中使用扩展数组agian时。
在函数调用后,我尝试使用input
打印printf("main string: %s\n", input)
,程序将崩溃。似乎*input
中的main
永远不会延长。
int dynamic_array(char *input, int *string_current_len){
int string_len = 0;
char temp_c;
input = (char *) malloc(sizeof(char));
if(input == NULL) {
printf("Could not allocate memory!");
exit(1);
}
printf("File to search in: ");
while((temp_c = getchar()) != '\n') {
realloc(input, (sizeof(char)));
input[string_len++] = temp_c;
}
input[string_len] = '\0';
printf("\nYou entered the string: %s\n", input);
printf("length of string is %d.\n", string_len);
*string_current_len = string_len;
return 1;
}
int main(void) {
int string_len = 0;
char *input;
printf("enter #q as filename or word to quit.\n");
if(!dynamic_array(input, &string_len)){
return 0;
}
printf("main string: %s\n", input);
return 0;
}
答案 0 :(得分:6)
此:
realloc(input, (sizeof(char)));
错了。 realloc()
函数不会修改给定的指针(它不能!),它返回新指针。它也可能失败,并返回NULL
。
此外,第二个参数根本没有任何意义,它应该是先前分配的缓冲区的新的所需总大小,但是你总是通过(非常模糊)1它不是“按这个数量增长”,而是更低级别的“尝试将其增长到这个新大小,并返回增长缓冲区的新位置”。
请仔细阅读the documentation。
答案 1 :(得分:0)
if(!dynamic_array(input, &string_len)){
return 0;
}
"输入"使用变量而不进行初始化。
realloc(input,(sizeof(char)));
以上" realloc"正在返回坏指针。它可能完全是假的,或者它可能是从另一个堆分配的。指针必须来自本地'堆。
答案 2 :(得分:0)
realloc(input, (sizeof(char)));
您正在分配相同的大小(即1个字节)。它应该是:
while((temp_c = getchar()) != '\n') {
realloc(input, (string_len + 1) * (sizeof(char)));
input[string_len++] = temp_c;
答案 3 :(得分:0)
C具有call-by-value语义。因此,对input
内的正式dynamic_array
的任何更改都不会传播给调用方(例如您的main
)。
您的main
未初始化input
。如果编译时包含所有警告和调试信息(如您所愿),例如使用gcc -Wall -g
,您会收到警告。
我实际上建议初始化每个局部变量。这使得调试更容易(因为运行更具可再现性)。优化程序将删除无用的初始化。
您可以使用
初始化input
内的main
char* input = NULL;
您应该重新设计自己的计划,可能需要grow_array
功能(而不是dynamic_array
),您可以在main
中调用
grow_array (&input, &string_len);
我请您正确宣布并实施grow_array
。我做你的功课太蹩脚了。
在grow_array
内,您要致电malloc
并对其进行测试:
*pptr = malloc(newsize);
if (!*pptr) { perror ("malloc"); exit (EXIT_FAILURE); };
不要忘记使用调试器(gdb
)逐步运行程序 。
我不建议使用realloc
,因为错误处理可能很棘手。我建议使用malloc
和free
以及巧妙地使用mempcy复制数据。
答案 4 :(得分:0)
int dynamic_array(char *input, int *string_current_len) should change to
int dynamic_array(char **input, int *string_current_len)
因为此函数正在尝试修改指针。 还要调用这里的函数
if(!dynamic_array(input, &string_len)){
return 0;
}
需要:
if(!dynamic_array(&input, &string_len)){
return 0;
}