- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
以下截取的代码是对我当前正在处理的代码的简化。它旨在构造一个输出字符串,通过字符串的连接构造。
#define _GNU_SOURCE
#include <argp.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <float.h>
#include <math.h>
#include <string.h>
int main(void) {
char *english[] = {"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"};
char *l_english = malloc(5*sizeof(char)*10+10+1);
char *ptr_eng = l_english;
for(int i = 0; i<10; i++){
ptr_eng = mempcpy(ptr_eng,english[i],strlen(english[i]));
printf("Iteration %d\n",i);
}
free(l_english);
return 0;
}
我在 Gentoo Linux 下用 gcc 4.8.3 编译。当我运行上面的程序时,它不会停止但会消耗 100% 的 CPU 内核。用 gdb 查看,结果是 mempcpy
进入了无限递归。
现在谈谈我已经尝试过的事情:
memcpy
并且不更改循环内的指针“ptr_eng”:同样,没有无穷无尽的递归。memcpy
并设置 eng_ptr = eng_ptr+strlen(english[i])
。又一次,无休止的递归发生了。可悲的是,当我用谷歌搜索 memcpy
和 for-loops 时,我只找到有关性能的讨论。我是 C 方面的新手,如果您能提供任何指导,我将不胜感激。
编辑
这里是相关 gdb 输出的链接 http://pastebin.com/nBZhqnsw ;这一直持续到发生段错误为止。
编辑 2
澄清一下:上面的代码只是我目前正在开发的一个程序的简化示例。 malloc
调用中的大小公式实际上只是对一些用于计算实际程序中实际所需内存量的变量的一次性替换。这个例子唯一重要的是它有足够的内存来保存 english
变量中的十个单词。
l_english 的预期结果是指向包含“zeroonetwothreefourfivesixseveneightnine”的内存块开头的指针。就像我说的,这只是为了 Stack Overflow 的简化。
最佳答案
我不知道为什么它不起作用,所以我只建议您保持程序简单,一切都会很好:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void) {
const char* english[] =
{
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine"
};
char *l_english = malloc(5*sizeof(char)*10+1); // 5 chars times 10 plus nul
char *ptr_eng = l_english;
for(size_t i=0; i<10; i++)
{
const char* ptr_ch = english[i];
while(*ptr_ch != '\0')
{
*ptr_eng = *ptr_ch;
ptr_eng++;
ptr_ch++;
}
printf("Iteration %d\n",i);
}
*ptr_eng = '\0';
puts(l_english);
free(l_english);
return 0;
}
输出:
Iteration 0
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
Iteration 6
Iteration 7
Iteration 8
Iteration 9
zeroonetwothreefourfivesixseveneightnine
另外,上面的while循环比memcpy + strlen更高效。
关于c - 使用 mempcpy 在 for 循环中串行构造字符串会导致无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25262830/
我正在尝试使用 Spark 从 Cassandra 读取数据。 DataFrame rdf = sqlContext.read().option("keyspace", "readypulse
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
我必须调试一个严重依赖 Gtk 的程序。问题是由于某些原因,在使用 GtkWindow 对象时开始出现许多运行时警告。问题是,即使 Gtk 提示严重错误,它也不会因这些错误而中止。我没有代码库的更改历
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
我有一个托管在 Azure 环境中的服务。我正在使用控制台应用程序使用该服务。这样做时,我得到了异常: "The requested service, 'http://xxxx-d.yyyy.be/S
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
目前我正在编写一个应用程序(目标 iOS 6,启用 ARC),它使用 JSON 进行数据传输,使用核心数据进行持久存储。 JSON 数据由 PHP 脚本通过 json_encode 从 MySQL 数
我对 Xamarin.Forms 还是很陌生。我在出现的主页上有一个非常简单的功能 async public Task BaseAppearing() { if (UserID
这是我的代码的简化版本。 public class MainActivity extends ActionBarActivity { private ArrayList entry = new Arr
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景: 库 1 有一个类 A,其构造函数如下: public A(Object obj) { /* boilerplate */ } 在以
如果网站不需要身份验证,我的代码可以正常工作,如果需要,则在打印“已创建凭据”后会立即出现 EXC_BAD_ACCESS 错误。我不会发布任何内容,并且此代码是直接从文档中复制的 - 知道出了什么问题
我在使用 NSArray 填充 UITableView 时遇到问题。我确信我正在做一些愚蠢的事情,但我无法弄清楚。当我尝试进行简单的计数时,我得到了 EXC_BAD_ACCESS,我知道这是因为我试图
我在 UITableViewCell 上有一个 UITextField,在另一个单元格上有一个按钮。 我单击 UITextField(出现键盘)。 UITextField 调用了以下方法: - (BO
我有一个应用程序出现间歇性崩溃。崩溃日志显示了一个堆栈跟踪,这对我来说很难破译,因此希望其他人看到了这一点并能为我指出正确的方向。 基本上,应用程序在启动时执行反向地理编码请求,以在标签中显示用户的位
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我正在使用新的 EncryptedSharedPreferences以谷歌推荐的方式上课: private fun securePrefs(context: Context): SharedPrefe
我有一个中继器,里面有一些控件,其中一个是文本框。我正在尝试使用 jquery 获取文本框,我的代码如下所示: $("#").click(function (event) {}); 但我总是得到 nu
在以下场景中观察到 TTS 初始化错误,太随机了。 已安装 TTS 引擎,存在语音集,并且可以从辅助功能选项中播放示例 tts。 TTS 初始化在之前初始化和播放的同一设备上随机失败。 在不同的设备(
maven pom.xml org.openjdk.jol jol-core 0.10 Java 类: public class MyObjectData { pr
在不担心冲突的情况下,可以使用 MD5 作为哈希值,字符串长度最多为多少? 这可能是通过为特定字符集中的每个可能的字符串生成 MD5 哈希来计算的,长度不断增加,直到哈希第二次出现(冲突)。没有冲突的
我是一名优秀的程序员,十分优秀!