将没有长度的指针作为目标传递给 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
我想知道我可以使用没有长度的字符指针作为 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