strcpy中的char *p和char p[]有什么区别[重复]

问题描述 投票:0回答:1

以下两段代码中的 char *p 和 char p[] 有什么区别:

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

void main()
{
    char source[]="stackflow";
    char target[0];
    strcpy(target,source);
    printf("%s", target);
}
#include<stdio.h>
#include<string.h>

void main()
{
    char source[]="stackflow";
    char *target;
    strcpy(target,source);
    printf("%s", target);
}

为什么前者工作而信件不工作?

c strcpy
1个回答
0
投票

在此代码中,这并不重要,因为两个代码都调用了未定义的行为(UB

  • 在第一个片段中
    target
    是一个长度为零的数组,你写在数组边界之外(它的长度为零)
  • 在第二个片段中
    target
    是一个未初始化的指针,你取消引用它调用UB。

你需要定义一个足够大的数组或者分配足够的内存来容纳

source
字符串。

  • char target[strlen(source) + 1];
  • char *target = malloc(strlen(source) + 1);

当您将数组或指针传递给

strcpy
时,它们的行为相同,因为引用是按值传递的,而数组在表达式中衰减为指针

为什么前者工作而信件不工作?

因为这是未定义行为的本质。 C 标准没有说明如果执行调用它的代码会发生什么。它可能会失败,也可能不会,格式化你的磁盘,将你的卡片详细信息发送给黑客或者其他东西

© www.soinside.com 2019 - 2024. All rights reserved.