memset 字符串的 strcmp 上的 SIGSEGV

2023-12-24

在下面的程序中,我期望 for 循环在 3 个元素后停止。 但它会无限期地继续下去,并在稍后因核心转储而失败。

  1. is malloc() needed forchar*[]`
  2. would strcmp如果我 memset 为 0 会失败吗?

.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
        char* str[10]; memset(str,0,10);

        str[0]=malloc(sizeof(char)*(strlen("Sample")+1));
        str[1]=malloc(sizeof(char)*(strlen("Sample")+1));
        str[2]=malloc(sizeof(char)*(strlen("Sample")+1));

        strcpy(str[0],"Sample");
        strcpy(str[1],"Sample");
        strcpy(str[2],"Sample");



        int i=0;
        for(i=0;strcmp("",str[i])!=0;i++)
        {
                printf("%d\n",i);;
        }
        return 0;
}

Edit:即使char* str[10]; memset(str,0,10*sizeof(char*));代码仍然给出核心转储


总结评论和其他答案中所述的所有内容,这里至少存在三个(或者,如果你想迂腐的话,四个)问题:

  1. 你需要memset(str, 0, 10*sizeof(char *)(但请参见下面的#4)。
  2. 调用前需要检查是否有空指针strcmp,使用类似的条件str[i] != NULL && strcmp("",str[i])!=0在你的for loop.
  3. 如果您在数组中存储了 10 个非空字符串,则循环将一直结束,永远不会找到空字符串。
  4. (迂腐的)memset不是初始化空指针数组的好方法。 (严格来说,它根本不能保证工作。)正如 @user3121023 在评论中建议的,更好的方法是char *str[10] = { NULL }.

您可以考虑在单独的变量中保留显式计数,而不是使用空字符串(或空指针)作为字符串数组末尾的标记。这可能是更常见的方法。


附录。您问的是是否需要分配字符串。确实需要为字符串分配内存,但不一定需要通过调用来动态分配内存malloc。至少有三种方法可以实现必要的分配,其中两种方法是编译器为您完成的。这是所有三个的示例:

char sample1[] = "Sample 1";

char *sample2 = malloc(strlen("Sample 2") + 1);
strcpy(sample2, "Sample 2");

str[0] = "Sample 0";
str[1] = sample1;
str[2] = sample2;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

memset 字符串的 strcmp 上的 SIGSEGV 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 您可以通过使用其构造函数来创建嵌套列表的深层副本吗?

    我知道你可以给出一个列表对象作为列表构造函数的参数copy1 列出另一个 通过这样做 您可以创建一个深拷贝如果使用的类型是简单的内置一次 到底是哪个 例如类型string List
  • 使用 AVX 与 NaN 进行比较

    我正在尝试创建一个快速解码器BPSK使用AVX英特尔的内在本质 我有一组复数 它们表示为交错浮点数 但由于BPSK仅需要调制实部 或偶数索引浮点数 每一个漂浮物x被映射到0 when x lt 0 and to 1 if x gt 0 这是
  • NASM 特定 - 章节与 [章节]

    我似乎无法在 NASM 的文档中找到任何关于在代码中使用 Section 或 SECTION 带括号 之间的区别的明确信息 我知道这些是宏 但我发现它们几乎可以互换使用 是这样吗 换句话说就是 SECTION text 相当于 Sectio
  • 变换形状

    我有两点想要以特定的方式连接 请参阅第一张图片 我知道所有四个点的坐标 然后我需要将整个形状移动到坐标 0 0 并旋转它 所以主要的两个点都在 x 轴上 参见第二张图 接下来我需要 挤压 形状仅 X 轴这样最后一个点的坐标为 0 1 参见最
  • 将构建类型更改为发布会导致某些类“无法解析符号”

    当我将构建类型更改为发布时 我的一些类在 android studio 中显示为 找不到符号 尽管显示错误 但应用程序已成功构建并运行 当我改回调试时 这些文件被正确识别 这是我的 build gradle apply plugin com
  • 在C编程中,“emit”有什么作用?

    我最近试图扩展我的 C 语言知识 我遇到了一个使用 emmit 的程序 可能emit a byte declspec naked void marker begin asm emit 0x51 emit 0x21 emit 0x1A emi
  • 系统找不到文件activatorconfig.txt

    我正在使用 play 框架 2 3 我按照页面上的说明进行操作https www playframework com documentation 2 3 x Installing https www playframework com do
  • Amazon S3 密钥中的特殊字符?

    按键中是否可以有像 这样的特殊字符 如果我在存储之前对密钥进行 urlencode 它会起作用 但我无法真正找到访问该对象的方法 如果我在 url 中写入 我会被拒绝访问 就像找不到对象时得到的结果一样 如果我对粘贴在浏览器中的 url 进
  • xcode-选择活动开发人员目录错误

    运行时看到以下错误npm install这需要node gyp 但可能会被任何需要的东西触发xcode select xcode select 错误 工具 xcodebuild 需要 Xcode 但处于活动状态 开发人员目录 Library
  • SQL Server 子查询返回超过 1 个值。当子查询跟在=、!=、<、<=、>、>=之后时,这是不允许的

    我运行以下查询 SELECT orderdetails sku orderdetails mf item number orderdetails qty orderdetails price supplier supplierid supp
  • 如何向 JQuery-steps 添加“重置”按钮

    我还没有看到有人问这个问题 尽管我确实阅读了大约 100 个关于类似主题的 jQuery 步骤 似乎没有一个能解决我的问题 我正在使用 jQuery steps 并希望在第一步完成后添加一个 重置 按钮 以防我的用户想要清除表单并重新开始
  • 在 AndroidKeystore 中保存和检索密钥对

    我需要生成 RSA 2048 密钥对 然后保存它 并恢复它 如果存在 此时此刻 我有这样的 SecureRandom random new SecureRandom RSAKeyGenParameterSpec spec new RSAKe
  • QGraphicsItem 仅通过 X 轴移动对象

    我在仅通过 x 轴移动对象时遇到问题 我知道你需要一些有功能的东西QVariant itemChange GraphicsItemChange change const QVariant value 我发现了这样的事情 QVariant C
  • .htaccess:此处不允许使用 LogLevel

    我想看看我的 htaccess 文件是如何工作的 我在里面放了一个 LogLevel 指令
  • 什么是 Yield?在 ASP .NET 中使用 Yield 有什么好处?

    你能帮助我理解吗yield关键字在asp NET C 收益回报会自动为您创建一个枚举器 http msdn microsoft com en us library 9k7k7cf0 aspx http msdn microsoft com
  • C#中如何将函数作为参数传递?

    C 中可以将函数作为参数传递吗 我可以使用 Func 或 Action 类来完成此操作 但这迫使我立即声明整个函数签名 当我尝试使用委托时 出现编译错误 指出它无法将方法组转换为委托 我正在尝试Axial http www codeplex
  • MySQL什么时候使用utf-8,什么时候使用latin1?

    我知道MySQL默认为latin1编码 显然需要 1 个字节来存储一个字符latin1和 3 个字节来存储一个字符utf 8 那是对的吗 我正在开发一个网站 希望该网站能够在全球范围内使用 我绝对需要吗utf 8 或者我可以不用使用 lat
  • 如何拆卸第一个电池顶部隔板和最后一个电池底部隔板

    我需要删除特定部分中第一个单元格的顶部边框和特定部分中最后一个单元格的底部边框 我在谷歌上搜索了从 tableView 中完全隐藏分隔符的解决方案 但我想避免它 另外 当您收到事件时单元格将显示以使用分隔符插入时 我还找到了解决方案 它适用
  • HTML 中的 BASE64 不起作用

    我尝试了所有可能的方法来使用 base64 字符串显示图像 但他们都没有工作 我在IE6 7 Firefox 3上测试过 请告诉我下面的代码有什么问题 img src data image jpg base64 968 img alt Em
  • memset 字符串的 strcmp 上的 SIGSEGV

    在下面的程序中 我期望 for 循环在 3 个元素后停止 但它会无限期地继续下去 并在稍后因核心转储而失败 is malloc needed forchar would strcmp如果我 memset 为 0 会失败吗 include