c - strcpy()/uninitialized char pointer 这段代码背后的技巧是什么?

标签 c pointers memory-management undefined-behavior strncpy

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main ()
{
  char *imsi;
  unsigned int i;
  int val;
  char *dest;

  imsi = "405750111";

  strncpy(dest,imsi,5);

  printf("%s",dest);

  /*  i = 10; */
}

在上面的代码中,i = 10 赋值如上注释,代码运行正常,没有错误。当编译包含赋值时,错误(segmentation fault) 发生在 strncpy(dest,imsi,5);.

通过避免优化变量 i(即 volatile int i;),错误被清除即使包含作业 (i = 10)。

最佳答案

在你的代码中,通过说

 strncpy(dest,imsi,5);

您正在尝试写入一个未初始化的指针 dest。它可以(而且很可能会)指向一些您的程序无法访问的内存(无效内存)。它调用 undefined behavior .

对于具有 UB 的程序,没有什么可以保证的。它可以按预期工作(实际上取决于您期望)或者它可能崩溃或打开您的银行账户并转移所有资金一些潜在的恐怖组织。

注意 - 我希望通过阅读最后一行你被吓到了,所以底线是

不要尝试写入任何未初始化的指针(内存区域)。期间。

关于c - strcpy()/uninitialized char pointer 这段代码背后的技巧是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36477421/

相关文章:

c - 如何使用 return 命令而不是 printf 来获得定义的 float 函数的相同输出?

pointers - 当我将变量传递给 golang 中的私有(private)方法时,它会创建一个新实例吗?

ios - 为什么 iOS 应用程序在两种不同的设备上表现不同?

objective-c - 将实例方法作为函数指针传递给 C 库

c - 在树中搜索(树不是 BST)

c - 无论质量如何,都以最佳压缩方式用 C++ 录制音频

c++ - 严格别名、CUdeviceptr 和 cuMemAllocManaged

pointers - 如何从 Box<Trait> 获取指向虚拟表的指针?

c++ - 在没有 malloc 和 free 的情况下存储和回收堆分配的可变大小对象

iphone - 释放内存分配的正确方法?