C语言中,将结构体指针传入函数后,内存地址没变,内存数据发生变化

本文详细解释了在C语言中,如何通过将结构体指针传入函数导致内存数据发生变化的过程,特别是关注于传入函数后内存地址未变但数据变化的现象。通过实例分析,在fileToRgbBufBlock函数内部通过局部变量返回地址的方式导致原始内存地址被释放后,数据仍然发生变化的原因。

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

C语言中,将结构体指针传入函数后,内存地址没变,内存数据发生变化:

rgbBlockInfo_t *rgbBlockInfo = NULL;

/*获得地址*/

rgbBlockInfo = fileToRgbBufBlock(rgbBufInfo, "D:\\picData\\pens.rgb");

/*将地址传入函数*/

rgbFileWrite(rgbBlockInfo,  "D:\\picData\\pens2.rgb");

传入函数后发现内存地址没有变化,但是内存地址指向的数据发生了变化。

传入前:


传入后:


所以,作为菜鸟的我,很疑问是哪里有修改内存中的值?

 

今天研究了一下,在fileToRgbBufBlock函數中,定义了局部变量rgbBlockInfo_t rgbBuf,最后通过return的方式将局部变量的地址返回。

问题就出现在这里,因为rgbBuf,是局部变量,在函数调用完成以后就会被释放。所以内存中的值会被释放掉。

在C语言中,你可以通过定义结构体指针或者动态内存分配来将一个字符串数组传递给另一个。这里有几个方法: **1. 结构体:** 创建一个包含字符串的结构体,然后传递指向这些结构体指针。例如: ```c typedef struct { char* str; } StringElement; // 声明和初始化字符串数组 StringElement strings = {{"Hello"}, {"World"}, {"C Language"}}; // 函数声明接收字符串数组 void passStrings(StringElement arr[], int len); // 传递数组 passStrings(strings, sizeof(strings) / sizeof(strings)); // 函数内部访问字符串 void passStrings(StringElement arr[], int len) { for(int i = 0; i < len; i++) { printf("%s\n", arr[i].str); } } ``` **2. 指针:** 直接将字符串数组作为指针传递,每个元素可以用`const char*`表示。 ```c void passStrings(const char** strings, int len) { for(int i = 0; i < len; i++) { printf("%s\n", strings[i]); } } // 调用 const char* stringArray[] = {"Hello", "World", "C Language"}; passStrings(stringArray, sizeof(stringArray) / sizeof(stringArray)); ``` **3. 动态内存:** 如果确定数组大小,可以使用动态内存分配(如`malloc`)来传递可变长度的字符串数组。但这通常更复杂,涉及额外的内存管理和释放。 ```c void passDynamicStrings(char*** strings, int* length) { *strings = (char**)malloc(*length * sizeof(char*)); for(int i = 0; i < *length; i++) { (*strings)[i] = malloc(strlen(*strings[i]) + 1); // 分配空间并复制字符串 strcpy(*strings[i], ...); // 初始化字符串 } } int main() { int dynamicLength = 3; char* dynamicStrings[] = {"Hello", "World", "C Language"}; passDynamicStrings(&dynamicStrings, &dynamicLength); // 在函数结束后别忘了释放内存 for(int i = 0; i < dynamicLength; i++) { free(dynamicStrings[i]); } free(dynamicStrings); return 0; } ``` 在以上所有情况下,记得正确处理内存,特别是动态分配的内存,以防内存泄漏。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值