我尝试了两种不同的方法来构建一个接受用户字符串输入并将其存储在变量中的函数。
实施A
char* input(size_t size)
{
char buffer[size];
char* str = (char*)malloc(sizeof(char) * sizeof(buffer));
if (fgets(buffer, size, stdin) != NULL)
{
buffer[strcspn(buffer, "n")] = ' ';
printf("Buffer says: %sn", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = ' ';
printf("str inside function says: %sn", str);
return str;
}
return NULL;
}
实现B
int input2(char* str, size_t size)
{
char buffer[size];
str = (char*)malloc(sizeof(char) * sizeof(buffer));
if (fgets(buffer, size, stdin) != NULL)
{
buffer[strcspn(buffer, "n")] = ' ';
printf("Buffer says: %sn", buffer);
strncpy(str, buffer, sizeof(buffer));
str[sizeof(buffer) - 1] = ' ';
printf("str inside function says: %sn", str);
return 0;
}
return -1;
}
main.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libs/custom/myio.h"
int main(int argc, char const *argv[])
{
char *ip1;
ip1 = input(1000);
printf("ip1 inside main says %sn", ip1);
free(ip1);
char* ip2;
input2(ip2, 1000);
printf("ip2 inside main says %sn", ip2);
free(p2);
return 0;
}
运行程序时:
Hi # user input
Buffer says: Hi
str inside function says: Hi
ip1 inside main says Hi
Hi # user input
Buffer says: Hi
str inside function says: Hi
ip2 inside main says (null)
A运行良好,但B则不然A不是我想要使用的方法,我更喜欢使用B。
当我尝试将valgrind与gdb一起调试时,它似乎在检测printf
函数中的错误(??(。
==177193== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
==177193==
==177193== 1 errors in context 1 of 2:
==177193== Conditional jump or move depends on uninitialised value(s)
==177193== at 0x48D71C2: __vfprintf_internal (vfprintf-internal.c:1688)
==177193== by 0x48C1EBE: printf (printf.c:33)
==177193== by 0x109276: main (main.c:19)
==177193== Uninitialised value was created by a stack allocation
==177193== at 0x109209: main (main.c:7)
==177193==
==177193== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
我做了很多研究,但我仍然不知道为什么B不起作用。
函数input2
("实现B"(中的问题是行
str = (char*)malloc(sizeof(char) * sizeof(buffer));
将仅修改函数input2
中的指针变量str
,该指针变量包含函数main
中的变量ip2
的值的副本。它不会在函数main
中设置原始变量ip2
的值。
如果您希望变量ip2
受到这行代码的影响,那么,您不应该将变量ip2
的值传递给函数input2
,而应该通过将函数的参数更改为以下内容来传递指向该变量的指针:
int input2( char** str, size_t size )
并通过改变线路
str = (char*)malloc(sizeof(char) * sizeof(buffer));
至:
*str = (char*)malloc(sizeof(char) * sizeof(buffer));
现在,当调用main
中的函数input2
时,不应该传递ip2
的值,而应该传递该变量的地址,如下所示:
input2( &ip2, 1000 );
现在,这个变量也应该受到函数input2
的变化的影响。
此外,值得注意的是,在C中(与C++相反(,不必投射malloc
的结果。请参阅此问题以获取更多信息:我是否强制转换malloc的结果?