C语言 将字符串直接放置到指针(不声明RAM中的静态或动态空间)是好的做法吗?

wkyowqbh  于 2023-01-01  发布在  其他
关注(0)|答案(3)|浏览(126)
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中确实很混乱
我想知道我的观点是否正确。

vaj7vani

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;之后,pqr将具有相同的地址,并且它们中没有一个具有比其他变量更高的特权,它们只是保存值的变量。
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设置为适当的地址,因此没有问题。

axzmvihb

axzmvihb2#

没有简单的答案--这要看情况而定,但是你的函数依赖于调用者提供一个有效的指针和一个有效的长度。2但是c代码就像这样,你完全受调用者的支配。3看看fgets函数,它也依赖于调用者提供有效的参数

ruarlubt

ruarlubt3#

这个函数没有分配内存的责任,内存已经被推给调用方。如果调用方在调用时没有正确分配内存,这个函数将失败,但不是因为它自己的错误。
因为您确实检查了fgets的结果,如果有错误,您确实返回了错误,所以一切都解决了。
当你说:
永远不要把字符串直接指向指针,指针指向RAM中的随机地址,而不进行静态空间或动态分配!!!
我认为你的意思是"永远不要写未初始化的指针",这是真的。它并不意味着"永远不要把字符串直接指向指针",因为这没有任何意义。
例如,如果你有这样的:

char* x;

load_text(x, 100);

这是 * 未定义的行为 *,没有进行分配,但这不是load_text函数本身的错误。这只是需要修复的错误代码。

相关问题