C字符串指针

3
为什么sscanf()不能将字符串写入char* s中?我将其初始化为NULL,因为我不想使用未初始化的变量。
#include <stdio.h>
#include <string.h>

int main()
{

    char* t = "I am a monkey";
    char *s = NULL;
    sscanf(t, "%s",s);
    printf("%s\n",s);


}

1
想一想将指针初始化为 NULL 的含义。 - juanchopanza
抱歉,我不太明白你的思路。我无法理解为什么sscanf不能将NULL简单地更改为字符串地址。 - kuan
1
在进行写操作时需要确保区域已经被安全分配。所以可以使用char *s = malloc(16)来代替char *s = NULL。(需要包含头文件#include <stdlib.h>),然后再使用printf("%s\n", s); free(s); - BLUEPIXY
2
@kuan 不行,因为它被指定去做其他的事情了。请阅读文档。 - juanchopanza
1
使用glibc时,sscanf(t, "%ms", &s);(记得释放s内存:free(s))。 - BLUEPIXY
1
@kuan 关于您的评论。C 函数是按值传递的,所以 sscanf 被传递了一个包含 NULL 的 s 的副本。它无法更改 s 的值。如果您仍然感到困惑,请查看按值传递的相关资料。 - Dylan Kirkby
3个回答

9

代码行 char *s = NULL 创建一个变量来存储字符的内存地址,并将该内存地址设置为零(NULL表示地址零)。

然后,代码行sscanf(t, "%s",s); 尝试将t的内容写入到位置s处的字符串中。由于您的进程无法访问地址零,因此会导致段错误。

您避免使用未初始化的变量的本能是好的,但您把它换成了未分配的指针!

通过声明一个在堆栈(或堆)上为s分配空间以修复此问题:

char s[STRING_LENGTH];

在这里,STRING_LENGTH 被定义为您想要分配的字符数。这将分配一块内存来容纳以空字符结尾的字符数组,并将 s 设置为第一个字符的地址。


1

这里的sscanf定义指出,...

int sscanf ( const char * s, const char * format, ...);

sscanf(t, "%s",s);

回复内容存在敏感词^**$ 分配一些内存空间给 s 或将 s 分配到某个有效的内存位置。

0
为什么sscanf()不能将字符串写入char* s中?我已将其初始化为NULL。
C标准库中的字符串函数不会分配存储空间。它们只是复制内容。您必须自己管理每个字节的字符串存储。对于从其他语言转换而来的人来说,这似乎很奇怪。
换句话说,您必须将*s指向一些内存,以便sscanf可以写入其中。如果使用NULL,则sscanf会将数据写入从地址NULL(通常为0)开始的内存中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接