Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以下对象存储在内存中的什么位置? #包括 #包括 #包括 #定义文本“祝您这次考试好运” int main(){ char*cPtr=(char*)malloc(sizeof(TEXT)); strncpy(cPtr,TEXT,sizeof(TEXT)); printf(“%s\n”,cPtr); 免费(cPtr); 返回(退出成功); } 变量cPtr的内存cPtr cPtr指向的地址 malloc()的代码 malloc()调用以移动 运行此程序的进程_C - Fatal编程技术网

以下对象存储在内存中的什么位置? #包括 #包括 #包括 #定义文本“祝您这次考试好运” int main(){ char*cPtr=(char*)malloc(sizeof(TEXT)); strncpy(cPtr,TEXT,sizeof(TEXT)); printf(“%s\n”,cPtr); 免费(cPtr); 返回(退出成功); } 变量cPtr的内存cPtr cPtr指向的地址 malloc()的代码 malloc()调用以移动 运行此程序的进程

以下对象存储在内存中的什么位置? #包括 #包括 #包括 #定义文本“祝您这次考试好运” int main(){ char*cPtr=(char*)malloc(sizeof(TEXT)); strncpy(cPtr,TEXT,sizeof(TEXT)); printf(“%s\n”,cPtr); 免费(cPtr); 返回(退出成功); } 变量cPtr的内存cPtr cPtr指向的地址 malloc()的代码 malloc()调用以移动 运行此程序的进程,c,C,我认为: 堆 堆叠 数据段 共享库内存 正确吗? 堆叠 堆 资料 共享库 我会这样回答这个问题 char*cPtr=NULL在堆栈上声明一个char*,并将其分配给point to NULL,在您的实例中,malloc()将其分配给point to heap memory,但cPtr变量本身在堆栈上 Malloc分配堆内存 文本字符串位于数据段中,sizeof(“文本字符串”)将作为数据段中地址的一个地址进行处理。我想你的问题是指“malloc参数的代码” 您的代码没有定义函数malloc,因此

我认为:

  • 堆叠
  • 数据段
  • 共享库内存
  • 正确吗?

  • 堆叠
  • 资料
  • 共享库
  • 我会这样回答这个问题

  • char*cPtr=NULL
    在堆栈上声明一个char*,并将其分配给point to NULL,在您的实例中,malloc()将其分配给point to heap memory,但cPtr变量本身在堆栈上

  • Malloc分配堆内存

  • 文本字符串位于数据段中,sizeof(“文本字符串”)将作为数据段中地址的一个地址进行处理。我想你的问题是指“malloc参数的代码”

  • 您的代码没有定义函数malloc,因此它所做的任何事情都必须发生在您包含的某个库中

  • 我可能在一个或多个答案上错了,但这是我的理解。如果有人能告诉我哪里错了,我会更正答案

  • 堆叠
  • 资料
  • 共享库
  • 我会这样回答这个问题

  • char*cPtr=NULL
    在堆栈上声明一个char*,并将其分配给point to NULL,在您的实例中,malloc()将其分配给point to heap memory,但cPtr变量本身在堆栈上

  • Malloc分配堆内存

  • 文本字符串位于数据段中,sizeof(“文本字符串”)将作为数据段中地址的一个地址进行处理。我想你的问题是指“malloc参数的代码”

  • 您的代码没有定义函数malloc,因此它所做的任何事情都必须发生在您包含的某个库中


  • 我可能在一个或多个答案上错了,但这是我的理解。如果有人能告诉我哪里错了,我会更正答案。

    唯一正确的答案是,无论编译器想在哪里。这可能不是您想要的答案,所以让我们来看看一个合理的编译器可能会选择什么

  • cPtr
    可能根本不会存储在内存中。它可以放在寄存器中(指针几乎总是放在CPU寄存器中),并且您从不获取它的地址,因此它可能位于一个或多个寄存器中。它可以写入堆栈,然后读回以在
    strncpy
    printf
    调用中保留其值,或者可以以其他方式保留其值。(请注意,编译器不需要在调用
    free
    后保留其值,因为您将不再使用它。)
  • malloc
    几乎总是返回一个堆指针,因为这是分配动态内存最容易的地方,如果不是唯一可能的位置的话。因此,缓冲区将位于堆中
  • 编译器在这里有一个选择。它可能引用某个共享库中链接的
    malloc
    ,在这种情况下,它将驻留在共享库代码中,或者它可能只是内联函数的全部或部分,在这种情况下,它的部分或全部可能驻留在程序的代码中
  • 这假设一个POSIX环境。在我所知道的每一个这样的环境中,这都是通过一个系统调用来处理的,
    sbrk
    。因此,此代码将驻留在操作系统的内核代码中
  • 编辑:由于一些人提到了静态字符串,
    “祝您在这个测试中好运”
    ,我认为讨论这个字符串也是值得的。此字符串出现在三种上下文中:

    • 作为宏替换(通过
      #define
      ),它在编译之前由预处理器处理,因此在最终输出中根本不去任何地方
    • 作为
      strncpy
      函数的一个参数,在这种情况下,它作为只读数据包括在程序的可执行代码中,或者与程序的可执行代码一起包含在专门为只读数据制作的单独部分中
    • 作为
      sizeof
      运算符的参数。这是三个案例中最有趣的一个。从技术上讲,它应该与前一个相等;但是,许多编译器可以静态计算常量字符串的大小(毕竟这非常简单),因此它们可以用普通的
      23
      替换
      sizeof(TEXT)
      ,并避免完全发出字符串(对于这种情况)

      • 唯一正确的答案是,无论编译器想在哪里。这可能不是您想要的答案,所以让我们来看看一个合理的编译器可能会选择什么

      • cPtr
        可能根本不会存储在内存中。它可以放在寄存器中(指针几乎总是放在CPU寄存器中),并且您从不获取它的地址,因此它可能位于一个或多个寄存器中。它可以写入堆栈,然后读回以在
        strncpy
        printf
        调用中保留其值,或者可以以其他方式保留其值。(请注意,编译器不需要在调用
        free
        后保留其值,因为您将不再使用它。)
      • malloc
        几乎总是返回一个堆指针,因为这是分配动态内存最容易的地方,如果不是唯一可能的位置的话。因此,缓冲区将位于堆中
      • 编译器在这里有一个选择。它可能引用某个共享库中链接的
        malloc
        ,在这种情况下,它将驻留在共享库代码中,或者它可能只是内联一个
        #include <stdlib.h>
        #include <stdio.h>
        #include <string.h>
        #define TEXT "Good luck on this test"
        int main () {
          char* cPtr = (char*)malloc(sizeof(TEXT));
          strncpy(cPtr,TEXT,sizeof(TEXT));
          printf("%s\n",cPtr);
          free(cPtr);
          return(EXIT_SUCCESS);
        }
        
        main:                                   # @main
            push    rbx
            mov     edi, 23
            call    malloc
            mov     rbx, rax
        
            ; at this point, rbx roughly corresponds to cPtr
            ; it's also still in rax but rax is overwritten by the next operation
        
            movabs  rax, 32777976875610985 ; btw this weird number is a piece of string
            mov     qword ptr [rbx + 15], rax
            movups  xmm0, xmmword ptr [rip + .L.str]
            movups  xmmword ptr [rbx], xmm0
        
            ; rbx (cPtr) is copied to rdi in order to give it to puts as argument
        
            mov     rdi, rbx
            call    puts
            mov     rdi, rbx
            call    free
            xor     eax, eax
            pop     rbx
            ret
        .L.str:
            .asciz  "Good luck on this test"