#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赋值如上所述,则代码工作正常,没有错误当编译包含赋值时,错误(分段错误)发生在strncpy(dest,imsi,5);。
通过避免对变量i(即volatile int i;)进行优化,即使包含赋值(i=10),也会清除错误。

最佳答案

在你的代码中,通过说

 strncpy(dest,imsi,5);

您正在尝试写入一个单元化指针dest它可以(而且很可能会)指向某些程序无法访问的内存(无效内存)。它调用undefined behavior
没有什么可以保证一个程序有UB。它可以按预期工作(实际上取决于你的预期),也可以崩溃或打开你的银行账户,将所有资金转移到某个潜在的恐怖组织。
注意-我希望通过读最后一行你会害怕,所以底线是
不要试图写入任何未初始化的指针(内存区域)周期。

关于c - 此代码的strcpy()/未初始化char指针背后的技巧是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36477421/

10-13 05:09