c - 带有 malloc 和 strcpy 代码的指针数组。如果 valgrid -s 不打印任何东西,这段代码有什么问题吗
问题描述
我有这个带有 malloc 和 strcpy 的指针数组的简单代码。
首先,我用 printf 和 free 声明并定义了指针数组,char *tokens[3]; tokens[0]=malloc(strlen("<html>")+1);
这段代码对 memoryc 泄漏是安全的吗
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char *tokens[3];
int main()
{
tokens[0]=malloc(strlen("<html>")+1);
strcpy(tokens[0],"<html>");
printf("%s\n",tokens[0]);
free(tokens[0]);
}
另外请让我知道如何在我尝试过的数组中的一行中分配三个指针,tokens
但这不起作用
tokens[0]=malloc((strlen("<html>")+1)+(strlen("<title>")+1));
解决方案
malloc.h
是非标准且已弃用,请stdlib.h
改用。除此之外,代码对于为 3 个字符串中的第一个字符串分配空间看起来是正确的。(正如有人在评论中所说,你应该添加错误处理。)
另外请让我知道如何在我尝试过的数组令牌中的一行中分配三个指针,但这不起作用
使用指针数组而不是二维字符数组的全部意义在于,您可以为每个指向的字符串设置单独的字符串长度。因此,除非您有非常特殊的要求,否则在单行中分配空间没有多大意义。所以这里的问题是为什么你首先想要堆分配。
假设您希望稍后替换字符串和realloc
内存,那么您可以简单地使用一些默认值初始化它们,如下所示:
const char* def[STR_N] =
{
"<html>",
"<foo>",
"<bar>",
};
char *tokens[STR_N];
for(size_t i=0; i<STR_N; i++)
{
tokens[i] = malloc(strlen(def[i])+1);
strcpy(tokens[i],def[i]);
printf("%s\n",tokens[i]);
}
由于它是非标准的,因此目前也strdup
被认为有些不好的做法,但看起来它将在即将到来的 C2x 中添加到标准中,因此这是另一种选择,而不是分两步进行分配 + 复制。
推荐阅读
- javascript - 让匿名用户通过 api 在我自己的个人 google 议程中创建事件
- postgresql - 如何检索 PostgreSQL 数据库和表静态数据并加载到 Power BI 仪表板?
- grep - 在 R 中使用 grep 进行数据清理
- c# - 如何在 Xamarin.Forms 页面中使用 Spotlight Xamarin.Android 库
- sql - 尽管编码设置与 DBI 相同,但 RODBC 未读取 unicode
- python - 按索引熊猫删除列
- python - MagicMock 对象的计算结果为 False
- karate - 使用空手道对 JSON 进行模式验证
- c++ - C++ struct 静态成员变量可以隐藏非类型模板参数吗?
- postgresql - 如果 postgres .sh 文件中不存在,则创建 db