程序如何识别由指针指向并动态创建的数组的结尾?

时间:2014-04-30 09:59:13

标签: c

您是否愿意帮助我了解指针和#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();
}

3 个答案:

答案 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方法中:你需要通过malloccalloc)分配一些内存,因为在它的当前阶段你的应用程序正在写入内存而不是由它拥有。当然,gettext的来电者需要free记忆。

最后:指针只是内存中的一个地址,它指向一些字节。应用程序的作用是以正确的方式解释这些字节,例如识别零终止字符串。

答案 2 :(得分:0)

  

程序如何识别数组的结尾,该数组是由指针

动态分配和指向的

这是由动态内存分配库例程在内部处理的,并且在每次实现时都会以不同方式处理。实际代码可以在stdlib中,也可以在OS API中。所以如何完成取决于编译器和操作系统。

  

这些数组存储在RAM

如果动态分配它们,它们就存储在堆上。

  

指针由类型和大小

定义

不,指针是一种类型,故事的结尾。

  

如何在RAM中实现动态分配,如下例所示

您没有链接包含动态分配的示例。您发布的代码是无意义的代码。它会尝试将数据复制到您分配指针的地址。这没有任何意义,因此程序会崩溃并烧毁。

如果重写程序以使scanf("%s", &text);scanf("%s", text);替换,则会尝试将数据复制到未初始化的指针地址,该地址是随机的。这是未定义的行为,也会导致程序崩溃和烧毁。