首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

char **我应该使用( char *)的malloc大小还是char*字符串长度的大小?

在C语言中,char *是一个指向指针的指针,而char 是一个指向字符的指针。根据你的问题,你想知道在动态分配内存时应该使用char 的字符串长度还是char 的malloc大小。

首先,让我们来了解一下这两种方法的区别和适用场景。

  1. 使用char *的字符串长度: 当你已经有一个字符串,并且想要动态分配一个与该字符串长度相同的内存块时,你可以使用strlen函数来获取字符串的长度,然后使用该长度来分配内存。这种方法适用于你已经有一个字符串,并且想要在内存中创建一个与之相同长度的副本。

例如,如果你有一个字符串str,你可以使用以下代码来动态分配与该字符串长度相同的内存块:

代码语言:c
复制

char newStr = (char )malloc(strlen(str) + 1);

代码语言:txt
复制

这里+1是为了给字符串末尾的空字符留出空间。

  1. 使用char *的malloc大小: 当你想要动态分配一个指定大小的内存块,并且后续可能会将其用作字符串时,你可以直接使用malloc函数来分配内存。这种方法适用于你想要分配一个指定大小的内存块,并且可能会在之后将其用作字符串。

例如,如果你想要分配一个大小为size的内存块,你可以使用以下代码:

代码语言:c
复制

char str = (char )malloc(size);

代码语言:txt
复制

现在,根据你的问题,你应该使用哪种方法取决于你的具体需求。如果你已经有一个字符串,并且想要在内存中创建一个与之相同长度的副本,那么你应该使用char 的字符串长度。如果你只是想要分配一个指定大小的内存块,并且可能会在之后将其用作字符串,那么你应该使用char 的malloc大小。

请注意,以上答案是基于C语言的,如果你使用的是其他编程语言,可能会有不同的内存分配方式和字符串处理方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一次事故,对MySql时间戳存char(10)还是int(10)有了全新认识

由于log_user_active数据量最大,所以猜想应该是log_user_active表出了问题,为了排查原因,把SQL又简化了下,去掉了JOIN直接简化为: SELECT log.user_id...此时,应该确信是这个表出问题无疑了,但是字段log_dtime明明建立了索引,怎么还这么慢呢? 经过各种百度,终于发现问题所在:由于log_dtime设计char类型。...如果想让他走索引,查询时候值必须要加引号,说明这是个字符串,否则是不会走索引数据恰巧都是数字组成(时间戳),查询时候也没有刻意去加引号,导致查询时候不走索引。...这就是问题所在了,于是进行如下尝试: 尝试1: SQL值加上引号 如上图,果然极快。 但是这样的话,需要改好多代码,想想还是尝试下方法2吧。...总结 char类型字段想走索引的话,必须用引号括起来。如果是时间戳等类型纯数字,建议还是存为int型吧。 愉快周末,又向我招手了。

94330

C语言中柔性数组 C语言结构体中charchar用法

等我快完成所有工作时候,听一位同事说可以使用char[0]用法来代替指针,差点一口老血喷出来。“你咋不早说…”。接下来从网上各种google,发现了这种用法巧妙,特写下此篇文章,以做记录。...(PS:还是要感谢那位同事YYL,让又get到一个技能^_^) 在结构体最后加char[0]或char[1]用法是GNU C扩展,在ISO/IEC 9899-1999里面,这么写是非法。...包含柔性数组成员结构要用malloc进行动态内存分配,并且分配内存应该大于结构大小,以适应柔性数组预期大小。...如果能够找出一种方法,既能直接引用该字符串,又不占用结构体空间,就完美了,符合这种条件代码结构应该是一个非对象符号地址,在结构体尾部放置一个0长度数组是一个绝妙解决方案。...柔性数组成员不仅可以用于字符数组,还可以是元素为其它类型数组。包含柔性数组成员结构用malloc ()函数进行内存动态分配,并且分配内存应该大于结构大小,以适应柔性数组预期大小

2.6K31

C和C++安全编码复习

字符串由一个以空字符(null)作为结束连续字符序列组成,并包含此空字符(sizeof=strlen+1) 一个指向字符串指针实际指向该字符串起始字符。 数组大小。...次优选择:可以使用带n替代函数,如strncpy/strncat/snprintf 需要注意是,带n版本函数会截断超出长度限制字符串,包括源字符串结尾’\0’。...这就很可能导致目标字符串以非’\0’结束。字符串缺少’\0’结束符,同样导致缓冲区溢出和其它未定义行为。需要程序员保证目标字符串以’\0’结束,所以带n版本函数也还是存在一定风险。...:申请内存应该只释放一次。...说明:申请内存时没有对指定内存大小整数作合法性校验,会导致未定义行为,主要分为两种情况: (1)使用 0 字节长度去申请内存行为是没有定义,在引用内存申请函数返回地址时会引发不可预知或不能立即发现问题

2.1K10

透过Redis源码探究字符串实现

但是随着 sds 版本变迁,其实在内存占用方面还是做了一些优化: 在 sds 2.0 之前 header 大小是固定 int 类型,2.0 版本之后会根据传入字符大小调整 header len...类型; 然后调用 sdsHdrSize 根据 header 类型获取 header 占用字节数; 最后调用 s_malloc 根据 header 长度字符串长度分配内存,这里需要加1是因为在 c...return s; } 上面的过程已经标注清楚了,可能直接看代码比较难理解这里头结构体构造过程,下面用一张图表示一下指针指向位置: 字符串拷贝 sds sdsnewlen(const void...len 大小 //根据要追加长度len和目标字符串s现有长度,判断是否要增加新空间 //返回还是字符串起始内存地址 s = sdsMakeRoomFor(s,len);...字符串是否可以在原来位置追加空间,还是需要重新申请一块内存区域。 那么下面把 sdsMakeRoomFor 函数分为两部分来看:扩容、内存申请。

18210

【C++】运算符重载案例 - 字符串类 ① ( Visual Studio 中创建 String 类 | 构造函数与析构函数 | 完整代码示例 )

int m_len , 注意 : 字符串长度 , 不包括 ‘\0’ , 实际内存占用空间大小 = 字符串长度 + 1 ; 字符串指针 char* m_p , 字符串指针指向堆内存中字符串 ;...private: // 字符串长度 , 不包括 '\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中字符串 char* m_p..., 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' m_len = 0; // 使用 new 关键字为 char* m_p; 指针分配内存 /..., 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' m_len = 0; // 使用 new 关键字为 char* m_p; 指针分配内存 //...) { // 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用

19620

malloc函数java_malloc函数详解及用法举例

大家好,又见面了,是你们朋友全栈君。...malloc动态内存分配函数头文件#include #include malloc函数使用要求 这个函数要实现功能是在系统中分配一段连续可用内存,具体有如下要求: 1.malloc分配内存大小至少为...应该尽快完成内存分配并返回. 5.实现malloc时应同时实现内存大小调整和内存释放函数(即realloc和free)....对于malloc更多说明可以在linux shell命令行中键入以下命令查看: man malloc 可以看见linux下malloc函数详细使用手册 与malloc函数相关函数 calloc(...memset(str,0,10); //如果不清空,申请区域值是随机,养成好习惯 strcpy(str,”happylife”); //使用strcpy特别注意拷贝字符串长度<=10-1,即要预留字符串结束标志

1.2K10

【C++】运算符重载案例 - 字符串类 ③ ( 重载 左移 << 运算符 | 自定义类使用技巧 | 直接访问类私有指针成员 | 为指针分配指定大小内存并初始化 0 )

'\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中字符串 char* m_p; }; 2、String.cpp 类实现 //..., 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' m_len = 0; // 使用 new 关键字为 char* m_p; 指针分配内存 //...) { // 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用...// 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用 new 关键字为..., 使用 String 对象初始化 对象值 String::String(const String& s) { // 拷贝字符串长度 // 注意 : 字符串指针 指向内存空间大小需要 +1 ,

14210

flexible array柔性数组、不定长数据结构Struct详解

还是回到上述结构体 struct Test{ int a; char *p; }; 我们想把字符串和结构体连在一起的话,释放内存时候就能够顺便把字符串内存给释放掉了,看一看下面的代码...); ((char*)(p_test+1))[len] = '\0'; 起始这么依赖,会发现char *p就成了多余东西了,我们完全可以使用语句(char*)(p_test+1)来获取字符串地址了。...聪明程序员不想被这么丑陋代码给糊弄,他们想如果能够找到一种方法既能直接引用字符串,又不占用结构体空间就很棒了。符合这个条件应该是一个非对象符号地址。...记得上文所说不完整类型吗,C99便是使用不完整类型实现柔性数组成员。为什么使用不完整类型呢,说说理解。...warning C4200: 使用了非标准扩展: 结构/联合中大小数组 由于这个是C99标准,在ISO C和C++规格说明书中是不允许。在vs下使用0长度数组可能会得到一个警告。

1.3K20

字符串三种存储方式

定长顺序存储   字符串定长顺序存储结构,可以理解为采用 “固定长度顺序存储结构” 来存储字符串,因此限定了其底层实现只能使用静态数组。   ...使用定长顺序存储结构存储字符串时,需结合目标字符串长度,预先申请足够大内存空间。   ...例如,采用定长顺序存储结构存储 “feizhufeifei”,通过目测得知此字符串长度为12(不包含结束符 ‘\0’),因此我们申请数组空间长度至少为 12,用 C 语言表示为: char str[18...当我们调用malloc时,就会在堆上划分一块空间给我们使用,具体代码如下: //创建了一个动态数组str,通过使用 malloc 申请了 10个 char 类型大小堆存储空间。...char * str = (char*)malloc(10*sizeof(char));   动态数组优势是长度可变,根据需要动态进行分配。当我不想申请新变量,但是又想要扩大str空间怎么办呢?

1.4K20

【C语言】动态内存管理

一、存在动态内存分配原因 我们已经掌握了两种内存开辟方式 int a = 10; int arr[3] = {0}; 但是这样开辟空间有两个特点: ①空间开辟大小是固定 ②数组长度大小不能改变...为0,此时malloc行为取决于编译器,是未定义 返回值为void* 所以在使用时要使用强制转换方式使malloc函数知道自己开辟空间类型 2、free void free (void* ptr...(); return 0; } 进入Test,指针str为NULL,进入GetMemory,将malloc开辟动态内存空间地址存到一级指针*p中 ,&str是取整个字符串地址都用二级指针接受,...首先str直接接受malloc开辟动态内存空间地址是不安全应该像上题一样修改一下,然后这块空间被free掉了,str就变成了野指针,很大可能不是NULL,那么它就会修改一个未知地方量为world...char a[0]; }s; int main() { printf("%d\n", sizeof(s)); return 0; } ③包含柔性数组结构用malloc进行内存动态分配,分配内存应该大于结构大小

1010

【C++】运算符重载案例 - 字符串类 ④ ( 重载 双等号 == 运算符 | 重载 不等号 != 运算符 | 代码示例 )

: // 字符串长度 , 不包括 '\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中字符串 char* m_p; }; 2、String.cpp..., 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' m_len = 0; // 使用 new 关键字为 char* m_p; 指针分配内存 //...) { // 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用...// 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用 new 关键字为..., 使用 String 对象初始化 对象值 String::String(const String& s) { // 拷贝字符串长度 // 注意 : 字符串指针 指向内存空间大小需要 +1 ,

18920

【C++】运算符重载案例 - 字符串类 ② ( 重载 等号 = 运算符 | 重载 数组下标 [] 操作符 | 完整代码示例 )

// 注意 : 字符串指针 指向内存空间大小需要 +1 , 内容是 '\0' this->m_len = s.m_len; // 使用 new 关键字为 char* m_p; 指针分配内存...[] 操作符 char& operator[](int i); private: // 字符串长度 , 不包括 '\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len;..., 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' m_len = 0; // 使用 new 关键字为 char* m_p; 指针分配内存 //...) { // 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用.../ 拷贝空字符串到 m_p 指向内存中 strcpy(m_p, ""); } else { // 获取传入字符串长度 // 但是 , 字符串指针 指向内存空间大小需要 +1 ,

29830

Redis源码剖析之SDS(Simple Dynamic String)

SDS也兼容部分C字符串API(strcmp,strlen),它如何兼容C字符串觉得也是有个很sao操作,等看完这篇博客你就明白了。...struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; /* 已使用空间大小 */ uint8_t alloc; /* 总共可用字符空间大小...,应该是实际buf大小减1(因为c字符串末尾必须是\0,不计算在内) */ unsigned char flags; /* 标志位,主要是识别这是sdshdr几,目前只用了3位,还有5位空余...alloc只占用两个字节,比较短字符串可能非常多,所以节省下来内存还是非常可观,知道了sds数据结构和设计原理,sdsnewlen代码就非常好懂了,如下: sds sdsnewlen(const...字符串长度 void sdsclear(sds s); // 清空sds中内容,但不释放空间 int sdscmp(const sds s1, const sds s2); // sds字符串比较大小

45420

C++奇迹之旅:C++内存管理机制初篇

strlen(char2) 返回字符串长度,不包括结尾 '\0',所以为 4。...在 64 位系统上,指针大小为 8 字节。 strlen(pChar3) 返回字符串长度,不包括结尾 '\0',所以为 4。...sizeof 和 strlen 是两个不同操作符/函数,sizeof 是一个编译时操作,返回变量或数据类型大小;而 strlen 是一个运行时函数,返回字符串长度。...char: %zu\n", sizeof(char)); // 输出: 1 strlen:strlen 是一个函数,用于计算字符串长度(不包括结尾 '\0' 字符),它在运行时计算字符串长度,需要遍历整个字符串...,对于数组,strlen 只能用于字符数组(字符串),不能用于其他类型数组,对于指针,strlen 可以计算指针所指向字符串长度

10510

第八节(字符和字符串

如果C语言以数字形式储存字符,那么程序如何知道给定char类型变量是字符还是数字?...另外,为字符分配存储空间时,应该用字面量值乘以数据类型大小才能得出需要分配空间数量。...这些变量都没有被初始化,现在还不能使用它们! 第14行调用malloc()函数,其参数是35乘以char类型大小。是否可以用35?...分配内存不要超过所需。并非每台计算机都有大量内存,应该节约使用。 赋值给字符数组字符串包含字符数不能超过该数组可储存最大字符数。...C语言将字符串储存在char类型数组中。要创建一个包含n+1和元素char类型数组,才能储存一个长度为n字符串使用内存分配函数(如,malloc() )可以在程序中动态地分配内存。

26830

【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )

, 不包括 '\0' // 内存占用空间大小 = 字符串长度 + 1 int m_len; // 字符串指针, 指向堆内存中字符串 char* m_p; }; 2、String.cpp 类实现..., 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' m_len = 0; // 使用 new 关键字为 char* m_p; 指针分配内存 //...) { // 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用...// 默认构造一个空字符串 , 字符串长度为 0 // 但是 , 字符串指针 指向内存空间大小是 1 , 内容是 '\0' this->m_len = 0; // 使用 new 关键字为..., 使用 String 对象初始化 对象值 String::String(const String& s) { // 拷贝字符串长度 // 注意 : 字符串指针 指向内存空间大小需要 +1 ,

32220

Redis使用及源码剖析-2.Redis简单动态字符串(SDS)-2021-1-16

对于第三点,柔型数组使用时一般根据len属性动态分配内存,如分配一个sdshdr对象来存放字符串代码如下所示: char *pStr = "Redis is too easy!"...所以使用 SDS 既不需要手动修改 SDS 空间大小,也不会出现前面所说缓冲区溢出问题。...如果是字符串长度增加,如上例中strcat,程序首先要通过realloc分配足够大小内存,再执行strcat。如果是字符串长度变小,程序就要通过free来释放掉不用内存。...如下所示: 如果对 SDS 进行修改之后, SDS 长度(也即是 len 属性值)将小于 1 MB , 那么程序分配和 len 属性同样大小使用空间, 这时 SDS len 属性值将和 free...分配使用空间可以通过free来记录,这样下次如果要增加字符串长度时,先看free大小能不能满足使用,如果满足可以直接使用,不满足再分配这样就可有效减少分配次数。

38820

c语言进阶部分详解(《高质量C-C++编程》经典例题讲解及柔性数组)

上篇文章介绍了介绍动态内存管理 相关内容:c语言进阶部分详解(详细解析动态内存管理)-CSDN博客 各种源码大家可以去github主页进行查找:唔姆/比特学习过程2 (gitee.com) 今天便接...应该使用字符数组来存储可修改字符串 所以我们可以用数组或者动态开辟进行改正问题 改进 void ToMalloc(char** p) { *p = (char*)malloc(100); } void...此时返回指针将指向无效内存(内存已经还给操作系统了) 1.3问题三 void ToMalloc(char** p, int num) { *p = (char*)malloc(num); } void...sizeof 返回这种结构大小不包括柔性数组内存 包含柔性数组成员结构一般使用malloc ()函数进行内存动态分配,并且分配内存应该大于结构大小,以适应柔性数组预期大小(多一部分要给柔性数组...s)); return 0; } 2.2柔性数组使用 struct s { char a; int b; int c[0];//柔性数组成员 }; int main() { struct

11310

Simple Dynamic Strings(SDS)源码解析和使用说明二

最后修改SDS字符串中代表已经使用了空间长度字段len,并把最后一位设置为NULL。...如果不是空间最小类型,则通过分配了空间大小alloc减去已使用空间大小len计算出还可用空间大小。        ...返回值是切割后字符串数组首地址,第二个参数是用于传出这个数组长度。它实现就是从头向尾遍历整个字符串空间,然后切分出各个字符串。由于过程比较简单,但是代码比较长,就不在这儿贴出来了。...        SDS字符串在初次创建时,其分配空间大小就是使用空间大小。...在字符串连接过程中,如果每次连接都要重新分配内存以承载更多数据,会导致效率下降。而我们在SDS字符串头结构中看到有用于保存已分配空间长度和已使用空间长度

87520
领券