c语言指针拷贝数据到数组,c语言之指针与数组理解一(数据拷贝)

本文详细解析了C语言中的字符串拷贝函数`copyStr`,该函数用于将源字符串复制到目标字符串。文章指出在使用时需判断指针是否为空,以避免空指针异常。通过示例代码展示了如何正确使用该函数,并给出了运行结果,展示了字符串的正确复制过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接给出例子

//数据的拷贝

void copyStr(char* souces, char* to){

/*

在c语言中,是无法对空指针进行数据的读取和写入的,这是受到操作系统的保护,如果要去访问

或者是写入数据,程序会直接挂掉的;所以这里要进行判断,是否对操作的指针已经进行内存分配了,

是否可以对它们进行操作

*/

if (souces == NULL || to == NULL)

return;

/*

在这里有几个问题要注意:

souces这里指向的是字母"R",它得到的是字符串常量的首地址;所以souces++是下一个字母的内存地址,

在c语言中,字符串是以\0结尾的,其实"Rose_Girls"你可以看成是"Rose_Girls\0",'\0‘对应的ASCII码为

0, 所以这里的判断条件就是查看是否是最后一个字符为'\0'这样也会把'\0’自动添加进去,不需我们手动加入

*/

while ((*to++ = *souces++));

}

int _tmain(int argc, _TCHAR* argv[]){

char* str1 = "Rose_Girls";

char str2[20];

copyStr(str1, str2);

printf("str2 = %s", str2);

system("pause");

return 0;

}

运行结果如下:

a95a5c7a3de84161bf72047b140ce758.jpg

### C语言结构体指针的深拷贝拷贝实现 #### 浅拷贝示例 当执行简单的赋值操作时,实际上只是复制指针本身而不是其所指向的对象。这意味着两个指针将共享同块内存区域。 ```c #include <stdio.h> #include <string.h> typedef struct { char name[20]; } Person; int main() { Person person1; strcpy(person1.name, "Alice"); // 创建个指向person1的指针并简单赋值给另指针 Person *ptr1 = &person1; Person *ptr2 = ptr1; // 这里只进行了指针地址的传递,并未创建新的对象实例 printf("Before modification:\n"); printf("Person pointed by ptr1: %s\n", (*ptr1).name); printf("Person pointed by ptr2: %s\n", (*ptr2).name); // 修改其中指针所指向的内容会影响另外指针的结果 strcpy((*ptr2).name, "Bob"); printf("\nAfter modifying through ptr2:\n"); printf("Person pointed by ptr1: %s\n", (*ptr1).name); printf("Person pointed by ptr2: %s\n", (*ptr2).name); return 0; } ``` 这段代码展示了浅拷贝的行为[^1]。`ptr2=ptr1`这步仅仅是让两个指针都指向同个`Person`类型的对象;因此改变任何指针的操作都会影响到对方。 #### 深拷贝示例 为了真正地克隆整个结构体及其内部数据成员(尤其是那些可能指向堆上分配的数据),则需要手动编写逻辑来进行深拷贝。下面的例子说明了如何安全地完成这过程: ```c #include <stdlib.h> /* For malloc */ #include <stdio.h> #include <string.h> typedef struct { int age; char* address; } Student; // 函数用于释放Student结构体内存资源 void free_student(Student **student_ptr){ if ((*student_ptr)->address != NULL) { free((*student_ptr)->address); } free(*student_ptr); } // 定义个新的函数来执行深拷贝 Student* deep_copy(const Student *source) { Student *target = (Student *)malloc(sizeof(Student)); target->age = source->age; size_t length = strlen(source->address)+1; target->address = (char*)malloc(length*sizeof(char)); strncpy(target->address, source->address, length); return target; } int main(){ const char original_address[]="No.189, Beijing Road"; Student student_source={23,(char*)original_address}; // 使用deep_copy函数进行深拷贝 Student *student_target = deep_copy(&student_source); printf("Original Address:%p -> '%s'\n",&(student_source.address),student_source.address); printf("Copied Address :%p -> '%s'\n",&(student_target->address),(student_target->address)); // 清理工作 free_student(&student_target); return 0; } ``` 在这个例子中,`deep_copy()`函数负责为新创建的学生记录分配足够的空间,并逐字节复制原始字符串内容到目标位置。这样做确保即使源对象被销毁或更改也不会影响已经存在的副本[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值