我有一个这样的结构:
typedef struct {
char* ptr;
int len;
int capa;
} String;
我想将分配给此结构对象的内存加倍。因此,在下面的函数中,我将指针传递给结构对象;我创建了另一个结构对象,它是内存的两倍。我将信息复制到新结构中,并使指针指向此结构。即使没有错误,内存分配也无法正常工作,如输出所示。功能可能有什么问题:
void DoubleCapacity(String *s){
String k;
k.len=s->len;
k.capa=(s->capa) * 2;
printf("s->capa is %dn", s->capa );
k.ptr=(char*) malloc(s->capa * 2);
printf("k.capa is %dn", s->capa*2 );
//printf("%dn", s->capa);
//printf("%dn", s->capa *2);
if (k.ptr == NULL) {
printf("Error occurs when allocating memoryn");
exit(1);
}
for(int i=0; i < s->len; i++){
k.ptr[i]=s->ptr[i];
}
s=&k;
}
此行
s=&k;
更改s
指向的位置,但更改是函数的本地更改。它不会更改调用函数中对象的内容。
- 不需要创建类型为
String
的新对象。 - 您需要更改
s->ptr
以指向新分配的内存。 - 您需要解除分配
s->ptr
指向的旧内存。 - 您需要更新
s
的容量。
void DoubleCapacity(String *s) {
int newCapa = (s->capa) * 2;
char* ptr = malloc(newCapa);
if (ptr == NULL) {
printf("Error occurs when allocating memoryn");
exit(1);
}
// Copy the data from old memory to new memory
memcpy(ptr, s->ptr, len);
free(s->ptr);
s->ptr = ptr;
s->capa = newCapa;
}
更好的版本,通过使用 realloc
.
void DoubleCapacity(String *s) {
int newCapa = (s->capa) * 2;
char* ptr = realloc(s->ptr, newCapa);
if (ptr == NULL) {
printf("Error occurs when allocating memoryn");
exit(1);
}
s->ptr = ptr;
s->capa = newCapa;
}
对于初学者,结构应按以下方式定义
typedef struct
{
char* ptr;
size_t len;
size_t capa;
} String;
函数本身应该像
int DoubleCapacity(String *s);
也就是说,该函数应报告容量翻倍是否成功。
此声明
s=&k;
没有意义。首先,poinrer s
是按值分页的,因此原始指针不会更改。该函数处理原始指针的副本。其次,您必须释放数据成员ptr
指向的早期分配内存,或者您应该realloc
内存。
可以按演示程序中显示的方式定义函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char *ptr;
size_t len;
size_t capa;
} String;
int DoubleCapacity(String *s)
{
char *tmp = realloc( s->ptr, 2 * s->capa );
int success = tmp != NULL;
if ( success )
{
s->ptr = tmp;
s->capa *= 2;
}
return success;
}
int main(void)
{
const char *hello = "Hello Doe";
String s = { 0 };
size_t n = strlen( hello );
s.ptr = malloc( n + 1 );
if ( s.ptr )
{
s.len = n;
s.capa = n + 1;
strcpy( s.ptr, hello );
}
printf( "s.len = %zun", s.len );
printf( "s.capa = %zun", s.capa );
printf( "s.ptr = "%s"nn", s.ptr );
DoubleCapacity( &s );
printf( "s.len = %zun", s.len );
printf( "s.capa = %zun", s.capa );
printf( "s.ptr = "%s"nn", s.ptr );
free( s.ptr );
return 0;
}
其输出
s.len = 9
s.capa = 10
s.ptr = "Hello Doe"
s.len = 9
s.capa = 20
s.ptr = "Hello Doe"