我有这样的结构:
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;
}
答案 0 :(得分:3)
这一行
var jsonConverted = JsonConvert.DeserializeObject<JsonObject>(json);
更改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 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"