将没有长度的指针作为目标传递给 memcpy 是否合法?

Is it legal to pass pointer without length as a destination into memcpy?

我想知道我可以使用没有长度的字符指针作为 memcpy 中的目标。 示例:我想将数据从定义长度的 char 数组复制到另一个数组中,但我想将其定义为没有特定大小的指针。

char * ptr_1;
char arr[4] = "Data";
memcpy(ptr_1, arr, 4); // IS it allowed to do this?

不,你不能那样做。如果你这样做,它会调用未定义的行为,因为 ptr_1 指向的地址是行列式,而你不拥有它。此外,您还没有分配任何内存来保存 arr.

中的内容

您可以为复制结果分配静态存储空间,也可以动态分配存储空间。 memcpy() 的原型是

void *memcpy( void *dst, void const *src, size_t length );

所以对于静态分配的地址,你可以这样做

#include <stdio.h>

int main(void) {
    char temp[5];
    char values[] = "Data";
    memcpy( temp, values, 4 );
    temp[4] = '[=11=]';
    printf("%s\n", temp);
    return 0;
}

ptr 指向的动态分配存储位置能够容纳 4 char 字节

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

#define SIZE 4

int main(void) {
    char *ptr;
    char values[] = "Data";
    ptr = malloc(sizeof(char) * (SIZE+1)); 
    if ( ptr == NULL ) return; 
    memcpy(ptr, values, SIZE);
    ptr[SIZE] = '[=12=]';
    printf("%s\n", ptr);
    return 0;
}

虽然 memcpy() 的原型定义了 void * 对源类型和目标类型的使用,但 C 标准并不强制要求它。指针可以在任何类型与 void * 之间转换,反之亦然。这就是为什么我们不区分 malloc() 结果的原因。

您总是需要分配存储空间以在末尾包含一个空字符。如果使用空长度说明符初始化数组,即 values[],编译器会自动分配存储空间以在末尾包含一个空字符。对于像 printf() 这样的库函数来打印一个字符串,理想情况下,它希望字符串在末尾以空字符结束。缺少它可能会触发未定义的行为,因为它不知道字符串的结尾在哪里(空字符)。所以在这两种情况下确保字符串的最后一个字节是空字符常量。

ptr_1 是一个指针,指向任何东西并在随机位置做 memcopy 会导致未定义的行为。

在调用 memcopy 之前必须将指针分配给有效地址。

像这样,

char buf[5];
char * ptr_1 = buf;
char arr[5] = "Data";
memcpy(ptr_1, arr, 5); //As string is null terminted need to conside `/0` char as well