内存分配和复制到新结构

时间:2018-04-17 16:43:17

标签: c arrays pointers struct segmentation-fault

我有这样的结构:

typedef struct {
    char* ptr;
    int len;
    int capa;
} String;

我想将分配给此结构对象的内存加倍。所以在下面的函数中我传递一个指向struct对象的指针;我创建了另一个结构对象,它是内存的两倍。我将信息复制到新结构,并使指针指向此结构。即使没有错误,内存分配也无法正常显示输出。关于功能可能有什么问题:

void DoubleCapacity(String *s){

String k;
k.len=s->len;
k.capa=(s->capa) * 2;
printf("s->capa is %d\n", s->capa );
k.ptr=(char*) malloc(s->capa * 2);

printf("k.capa is %d\n", s->capa*2 );
//printf("%d\n", s->capa);
//printf("%d\n", s->capa *2);
if (k.ptr == NULL) {
    printf("Error occurs when allocating memory\n");
    exit(1);
}


for(int i=0; i < s->len; i++){
    k.ptr[i]=s->ptr[i];

}

s=&k;

}

2 个答案:

答案 0 :(得分:3)

这一行

var jsonConverted = JsonConvert.DeserializeObject<JsonObject>(json);

更改s=&k; 指向的位置,但更改是函数的本地更改。它不会更改调用函数中对象的内容。

  1. 您无需创建s类型的新对象。
  2. 您需要将String更改为指向新分配的内存。
  3. 您需要释放s->ptr指向的旧内存。
  4. 您需要更新s->ptr
  5. 的容量
    s

    更好的版本,使用void DoubleCapacity(String *s) { int newCapa = (s->capa) * 2; char* ptr = malloc(newCapa); if (ptr == NULL) { printf("Error occurs when allocating memory\n"); 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

答案 1 :(得分:0)

对于初学者,结构应按以下方式定义

typedef struct 
{
    char* ptr;
    size_t len;
    size_t capa;
} String;

函数本身应该声明为

int DoubleCapacity(String *s);

这是函数应该报告容量是否成功加倍。

本声明

s=&k;

没有意义。首先,指针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 = %zu\n", s.len );
    printf( "s.capa = %zu\n", s.capa );
    printf( "s.ptr = \"%s\"\n\n", s.ptr );

    DoubleCapacity( &s );

    printf( "s.len = %zu\n", s.len );
    printf( "s.capa = %zu\n", s.capa );
    printf( "s.ptr = \"%s\"\n\n", 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"