char* load_text(char* text, int how_many)
{
char* result = 0;
char* here = 0;
result = fgets(text, how_many, stdin);
if (result)
{
here = strchr(text, '\n');
if (here)
*here = '\0';
else
while (getchar() != '\n')
continue;
}
return result;
}
此函数很简单,从键盘发送字符串并放入指针变量,然后在此字符串中搜索新行"\n",并在此处删除空字符"\0",然后按Enter键时从函数中删除新行
我的问题是:
把string直接指向从fgets()函数到指针 * result的指针好吗?
或者这是一种不好的做法?
因为我查了很多关于这个问题的资料,很多人告诉我:
永远不要把字符串直接指向指针,指针指向RAM中的随机地址,而不进行静态空间或动态分配!!!
我从Stephen Prat的书"C Primer Plus,第6版"中学习C编程语言,我在这本书中创建了这个示例
从我的Angular 来看,我认为直接将字符串放入随机地址RAM而不为字符串静态声明空间或动态分配是非常糟糕的主意
如果我错了请纠正我?我认为这个例子在RAM中确实很混乱
我想知道我的观点是否正确。
3条答案
按热度按时间vaj7vani1#
有一种观念认为内存是与指针相关联的,比如在
int *p = malloc(3 * sizeof *p);
中,有人说内存是“分配给p
的“,这是不正确的,内存被分配,那个内存的地址被返回,那个地址被赋给p
,意味着p
的值被设置为该地址。没有存储器的所有权与p
相关联,除了X1 M6 N1 X当前持有存储器的地址之外,在X1 M5 N1 X和存储器之间也没有形成任何持久的关系。在
int *q = p;
和int *r = p;
之后,p
、q
和r
将具有相同的地址,并且它们中没有一个具有比其他变量更高的特权,它们只是保存值的变量。在
result = fgets(text, how_many, stdin);
中,fgets
返回的值被赋值给result
,在此之前不需要分配任何内存给result
指向,实际上这样做会适得其反,因为赋值给result
的地址会被result = fgets(text, how_many, stdin);
覆盖。把string直接指向从fgets()函数到指针 *result的指针好吗?
没事的
许多人告诉我:永远不要把字符串直接指向指针,指针指向RAM中的随机地址,而不进行静态空间或动态分配!!!
在指针被分配到一个合适的地址之前,你不应该使用指针。例如,在
result
被设置为指向一个合适地址的指针之前,你不应该使用*result
,如*result = x;
或x = *result;
。result = fgets(text, how_many, stdin);
将result
设置为适当的地址,因此没有问题。axzmvihb2#
没有简单的答案--这要看情况而定,但是你的函数依赖于调用者提供一个有效的指针和一个有效的长度。2但是c代码就像这样,你完全受调用者的支配。3看看
fgets
函数,它也依赖于调用者提供有效的参数ruarlubt3#
这个函数没有分配内存的责任,内存已经被推给调用方。如果调用方在调用时没有正确分配内存,这个函数将失败,但不是因为它自己的错误。
因为您确实检查了
fgets
的结果,如果有错误,您确实返回了错误,所以一切都解决了。当你说:
永远不要把字符串直接指向指针,指针指向RAM中的随机地址,而不进行静态空间或动态分配!!!
我认为你的意思是"永远不要写未初始化的指针",这是真的。它并不意味着"永远不要把字符串直接指向指针",因为这没有任何意义。
例如,如果你有这样的:
这是 * 未定义的行为 *,没有进行分配,但这不是
load_text
函数本身的错误。这只是需要修复的错误代码。