c - 内存分配和复制到新结构



我有一个这样的结构:

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指向的位置,但更改是函数的本地更改。它不会更改调用函数中对象的内容。

  1. 不需要创建类型为 String 的新对象。
  2. 您需要更改s->ptr以指向新分配的内存。
  3. 您需要解除分配s->ptr指向的旧内存。
  4. 您需要更新 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"

相关内容

  • 没有找到相关文章

最新更新