您是否愿意帮助我了解指针和#34;的机制?在C:
程序如何识别数组的结尾,该数组是由指针动态分配和指向的(例如:montext1)?这些数组存储在RAM中(可能不在数据中,不在堆栈中,可能在堆中)?
指针由类型和大小定义:如何在RAM中实现动态分配,如下例所示?
#include <stdio.h>
char * gettext()
{
char *text;
printf("Text:");
scanf("%s", &text);
printf("\n");
return text;
}
int main()
{
char *montext1 = gettext();
char *montext2 = gettext();
}
答案 0 :(得分:1)
您的程序非常错误,并且有未定义的行为。所以这不是一个很好的讨论起点。
程序中没有“动态分配”,只是混乱覆盖随机内存。
应该使用堆分配,即:
char * gettext(void)
{
char *s;
printf("Text:");
fflush(stdout);
if((s = malloc(256)) != NULL)
{
if(fgets(s, 256, stdin) == NULL)
{
free(s);
s = NULL;
}
}
return s;
}
来电者必须free()
返回的字符串,并在打印前检查NULL
。
答案 1 :(得分:0)
这里的问题是CPU不知道指针指向的数据的结尾。对于CPU,它只是内存中的原始字节,可以是应用程序字节,也可以是用户输入的数据。但是,通过C std库编译的C代码知道字符串(char*
)应该以零字节结束。这就是它知道结局的方式。
但是,在gettext
方法中:你需要通过malloc
(calloc
)分配一些内存,因为在它的当前阶段你的应用程序正在写入内存而不是由它拥有。当然,gettext
的来电者需要free
记忆。
最后:指针只是内存中的一个地址,它指向一些字节。应用程序的作用是以正确的方式解释这些字节,例如识别零终止字符串。
答案 2 :(得分:0)
程序如何识别数组的结尾,该数组是由指针
动态分配和指向的
这是由动态内存分配库例程在内部处理的,并且在每次实现时都会以不同方式处理。实际代码可以在stdlib
中,也可以在OS API中。所以如何完成取决于编译器和操作系统。
这些数组存储在RAM
中
如果动态分配它们,它们就存储在堆上。
指针由类型和大小
定义
不,指针是一种类型,故事的结尾。
如何在RAM中实现动态分配,如下例所示
您没有链接包含动态分配的示例。您发布的代码是无意义的代码。它会尝试将数据复制到您分配指针的地址。这没有任何意义,因此程序会崩溃并烧毁。
如果重写程序以使scanf("%s", &text);
被scanf("%s", text);
替换,则会尝试将数据复制到未初始化的指针地址,该地址是随机的。这是未定义的行为,也会导致程序崩溃和烧毁。