- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新@2014.05.01:
我使用 Xcode 创建一个新项目,并将以下源代码复制到新项目中。然后代码按预期运行,错误消失。
所以我怀疑是项目配置导致了错误。但两个项目(一个有错误的项目和一个没有错误的项目)都使用 Xcode 默认配置。这个link 是有错误的项目,希望对查找问题有所帮助。
====================
我正在使用Xcode练习一些小型C语言程序(项目类型:Command Line Tool,语言:C)。
但是,当我调试程序时,我遇到了一个奇怪的错误。源码如下:
//
// main.c
// c_review
//
// Created by liudanking on 4/25/14.
// Copyright (c) 2014 liudanking. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *base_add(const char *a, const char *b);
char *base_minus(const char *a, const char *b);
char *big_add(const char *a, const char *b);
char *big_minus(const char *a, const char *b);
char *big_multiply(const char *a, const char *b);
void align_big(const char *a, char *out);
void align_big(const char *a, char *out)
{
int i;
for (i=0; i < strlen(a); i++)
{
if (a[i] != '0')
{
if (a[i] != '\0')
{
strcpy(out+99-strlen(a+i), a+i);
}
else
{
strcpy(out+98, "0");
}
break;
}
}
}
char *base_add(const char *a, const char *b)
{
char _a[100], _b[100];
char *ret, *ret_align;
int i, carry, sum_one;
ret = (char*)malloc(101);
if (ret == NULL)
{
printf("malloc failed");
}
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
memset(ret, '0', 101);
ret[100] = '\0';
// align a and b
align_big(a, _a);
align_big(b, _b);
carry = 0;
for (i=98; i>=0; i--)
{
sum_one = _a[i] - '0' + _b[i] - '0' + carry;
carry = sum_one/10;
sum_one = sum_one % 10;
*(ret+i+1) = sum_one + '0';
}
for (i=0; i< 100; i++)
{
if (ret[i] != '0')
{
ret_align = (char*)malloc(120-i);
if (ret[i] != '\0')
strcpy(ret_align, ret+i);
else
strcpy(ret_align, "0");
free(ret);
break;
}
}
return ret_align;
}
char *base_minus(const char *a, const char *b)
{
char _a[100], _b[100];
char *ret, *ret_align;
int i, borrow, tmp;
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
ret = (char*)malloc(100);
memset(ret, '0', 100);
ret[99] = '\0';
// align a and b
//strcpy(_a+(99-strlen(a)), a);
//strcpy(_b+(99-strlen(b)), b);
align_big(a, _a);
align_big(b, _b);
borrow = 0;
for (i=98; i>=0; i--)
{
tmp = _a[i] - _b[i] - borrow;
if (tmp >= 0)
{
ret[i] = tmp + '0';
borrow = 0;
}
else
{
ret[i] = tmp + 10 + '0';
borrow = 1;
}
}
for (i=0; i< 100; i++)
{
if (ret[i] != '0')
{
ret_align = (char*)malloc(100-i);
if (ret[i] != '\0')
strcpy(ret_align, ret+i);
else
strcpy(ret_align, "0");
free(ret);
break;
}
}
return ret_align;
}
char *big_add(const char *a, const char *b)
{
char *ret, *p, *tp;
char _a[100], _b[100];
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
if (a[0] != '-' && b[0] != '-')
{
// printf("%s+%s\n", a,b);
return base_add(a, b);
}
printf("%d:%d:%d\n", a[0]!='-', b[0]=='-', a[0]!='-' && b[0]=='-');
if (a[0]!='-' && b[0]=='-')
{
// align a and b
printf("%d\n", strlen(a));
strcpy(_a+99-strlen(a), a);
strcpy(_b+(99-strlen(b)+1), b+1);
if (strcmp(_a, _b) >= 0)
{
return base_minus(_a, _b);
}
else
{
p = base_minus(_b, _a);
ret = (char*)malloc(102);
ret[0] = '-';
strcpy(ret+1, p);
free(p);
return ret;
}
}
if (a[0] == '-' && b[0] != '-')
{
// align a and b
strcpy(_a+(99-strlen(a)+1), a+1);
strcpy(_b+(99-strlen(b)), b);
if (strcmp(_a, _b) > 0)
{
p = base_minus(_a, _b);
ret = (char*)malloc(102);
ret[0] = '-';
strcpy(ret+1, p);
free(p);
return ret;
}
else
{
return base_minus(_b, _a);
}
}
if (a[0] == '-' && b[0] == '-')
{
p = base_add(a+1, b+1);
ret = (char*)malloc(102);
ret[0] = '-';
strcpy(ret+1, p);
free(p);
return ret;
}
// return result
return ret;
}
char *big_minus(const char *a, const char *b)
{
char _b[100];
memset(_b, '0', sizeof(_b));
if (b[0] == '-')
{
return big_add(a, b+1);
}
else
{
_b[0] = '-';
strcpy(_b+1, b);
return big_add(a, _b);
}
return NULL;
}
char *big_multiply(const char *a, const char *b)
{
char *ret, *p, *mid_ret;
char _a[100], _b[100];
int i, j, carry, sign, tmp;
ret = (char*)malloc(202);
p = (char*)malloc(202);
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
memset(ret, '0', 202);
ret[201]='\0';
sign = 0;
if (a[0] == '-')
{
sign++;
strcpy(_a+99-strlen(a)+1, a+1);
}
else
{
strcpy(_a+99-strlen(a), a);
}
if (b[0] == '-')
{
sign++;
strcpy(_b+99-strlen(b)+1, b+1);
}
else
{
strcpy(_b+99-strlen(b), b);
}
carry = 0;
for (i=98; i>=0; i--)
{
memset(p, '0', 202);
p[201]='\0';
for (j=98; j>=0; j--)
{
tmp = (_b[i] - '0') * (_a[j] - '0') + carry;
carry = tmp / 10;
*(p+200+i-98 + j - 98) = tmp % 10 + '0';
}
mid_ret = big_add(ret, p);
strcpy(ret, mid_ret);
free(mid_ret);
}
free(p);
return ret;
}
int main(void)
{
char *ret, *ret2;
char a[100], b[100], c[100], d[100];
strcpy(a, "99");
strcpy(b, "1001");
//printf("%d, %s, %02x; %d, %s, %02x\n", sizeof(a)/sizeof(a[0]),a, a, sizeof(b)/sizeof(b[0]),b,b);
ret = big_add(a, b);
printf("%s\n", ret);
if (ret)
free(ret);
strcpy(c, "99");
strcpy(d, "1001");
ret2 = big_minus(c, d);
printf("%s\n", ret2);
if (ret2)
free(ret2);
ret = big_multiply(a, b);
printf("%s\n", ret);
if (ret)
free(ret);
return 0;
}
直接在 Xcode 中运行代码会在第 93 行出现错误“EXC_BAD_ACCESS (code=1, address=0x31)”:
memset(_a, '0', sizeof(_a)); // Thread 1: EXC_BAD_ACCESS (code=1, address=0x31)
但是,如果我使用命令 ./my_app 在终端中运行已编译的应用程序,则不会出现错误。
我仔细检查了线路,但没有发现错误。
当我将函数实现移动到主函数之后的位置(如下所示)时,错误消失了。
//
// main.c
// c_review
//
// Created by liudanking on 4/25/14.
// Copyright (c) 2014 liudanking. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *base_add(const char *a, const char *b);
char *base_minus(const char *a, const char *b);
char *big_add(const char *a, const char *b);
char *big_minus(const char *a, const char *b);
char *big_multiply(const char *a, const char *b);
void align_big(const char *a, char *out);
int main(void)
{
char *ret, *ret2;
char a[100], b[100], c[100], d[100];
strcpy(a, "99");
strcpy(b, "1001");
//printf("%d, %s, %02x; %d, %s, %02x\n", sizeof(a)/sizeof(a[0]),a, a, sizeof(b)/sizeof(b[0]),b,b);
ret = big_add(a, b);
printf("%s\n", ret);
if (ret)
free(ret);
strcpy(c, "99");
strcpy(d, "1001");
ret2 = big_minus(c, d);
printf("%s\n", ret2);
if (ret2)
free(ret2);
ret = big_multiply(a, b);
printf("%s\n", ret);
if (ret)
free(ret);
return 0;
}
void align_big(const char *a, char *out)
{
int i;
for (i=0; i < strlen(a); i++)
{
if (a[i] != '0')
{
if (a[i] != '\0')
{
strcpy(out+99-strlen(a+i), a+i);
}
else
{
strcpy(out+98, "0");
}
break;
}
}
}
char *base_add(const char *a, const char *b)
{
char _a[100], _b[100];
char *ret, *ret_align;
int i, carry, sum_one;
ret = (char*)malloc(101);
if (ret == NULL)
{
printf("malloc failed");
}
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
memset(ret, '0', 101);
ret[100] = '\0';
// align a and b
align_big(a, _a);
align_big(b, _b);
carry = 0;
for (i=98; i>=0; i--)
{
sum_one = _a[i] - '0' + _b[i] - '0' + carry;
carry = sum_one/10;
sum_one = sum_one % 10;
*(ret+i+1) = sum_one + '0';
}
for (i=0; i< 100; i++)
{
if (ret[i] != '0')
{
ret_align = (char*)malloc(120-i);
if (ret[i] != '\0')
strcpy(ret_align, ret+i);
else
strcpy(ret_align, "0");
free(ret);
break;
}
}
return ret_align;
}
char *base_minus(const char *a, const char *b)
{
char _a[100], _b[100];
char *ret, *ret_align;
int i, borrow, tmp;
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
ret = (char*)malloc(100);
memset(ret, '0', 100);
ret[99] = '\0';
// align a and b
//strcpy(_a+(99-strlen(a)), a);
//strcpy(_b+(99-strlen(b)), b);
align_big(a, _a);
align_big(b, _b);
borrow = 0;
for (i=98; i>=0; i--)
{
tmp = _a[i] - _b[i] - borrow;
if (tmp >= 0)
{
ret[i] = tmp + '0';
borrow = 0;
}
else
{
ret[i] = tmp + 10 + '0';
borrow = 1;
}
}
for (i=0; i< 100; i++)
{
if (ret[i] != '0')
{
ret_align = (char*)malloc(100-i);
if (ret[i] != '\0')
strcpy(ret_align, ret+i);
else
strcpy(ret_align, "0");
free(ret);
break;
}
}
return ret_align;
}
char *big_add(const char *a, const char *b)
{
char *ret, *p, *tp;
char _a[100], _b[100];
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
if (a[0] != '-' && b[0] != '-')
{
// printf("%s+%s\n", a,b);
return base_add(a, b);
}
printf("%d:%d:%d\n", a[0]!='-', b[0]=='-', a[0]!='-' && b[0]=='-');
if (a[0]!='-' && b[0]=='-')
{
// align a and b
printf("%d\n", strlen(a));
strcpy(_a+99-strlen(a), a);
strcpy(_b+(99-strlen(b)+1), b+1);
if (strcmp(_a, _b) >= 0)
{
return base_minus(_a, _b);
}
else
{
p = base_minus(_b, _a);
ret = (char*)malloc(102);
ret[0] = '-';
strcpy(ret+1, p);
free(p);
return ret;
}
}
if (a[0] == '-' && b[0] != '-')
{
// align a and b
strcpy(_a+(99-strlen(a)+1), a+1);
strcpy(_b+(99-strlen(b)), b);
if (strcmp(_a, _b) > 0)
{
p = base_minus(_a, _b);
ret = (char*)malloc(102);
ret[0] = '-';
strcpy(ret+1, p);
free(p);
return ret;
}
else
{
return base_minus(_b, _a);
}
}
if (a[0] == '-' && b[0] == '-')
{
p = base_add(a+1, b+1);
ret = (char*)malloc(102);
ret[0] = '-';
strcpy(ret+1, p);
free(p);
return ret;
}
// return result
return ret;
}
char *big_minus(const char *a, const char *b)
{
char _b[100];
memset(_b, '0', sizeof(_b));
if (b[0] == '-')
{
return big_add(a, b+1);
}
else
{
_b[0] = '-';
strcpy(_b+1, b);
return big_add(a, _b);
}
return NULL;
}
char *big_multiply(const char *a, const char *b)
{
char *ret, *p, *mid_ret;
char _a[100], _b[100];
int i, j, carry, sign, tmp;
ret = (char*)malloc(202);
p = (char*)malloc(202);
memset(_a, '0', sizeof(_a));
memset(_b, '0', sizeof(_b));
memset(ret, '0', 202);
ret[201]='\0';
sign = 0;
if (a[0] == '-')
{
sign++;
strcpy(_a+99-strlen(a)+1, a+1);
}
else
{
strcpy(_a+99-strlen(a), a);
}
if (b[0] == '-')
{
sign++;
strcpy(_b+99-strlen(b)+1, b+1);
}
else
{
strcpy(_b+99-strlen(b), b);
}
carry = 0;
for (i=98; i>=0; i--)
{
memset(p, '0', 202);
p[201]='\0';
for (j=98; j>=0; j--)
{
tmp = (_b[i] - '0') * (_a[j] - '0') + carry;
carry = tmp / 10;
*(p+200+i-98 + j - 98) = tmp % 10 + '0';
}
mid_ret = big_add(ret, p);
strcpy(ret, mid_ret);
free(mid_ret);
}
free(p);
return ret;
}
确实很奇怪……
我的代码有什么问题吗?有人知道原因吗? :)
最佳答案
我没有收到您报告的错误(当我使用 Xcode 5.1.1 构建时)。但你问“我的代码出了什么问题?”,这是相当开放式的。
您的症状与损坏的堆栈一致。寻找可能覆盖字符数组的地方。对零终止字符串的错误处理是错误的丰富来源。如果操作错误,malloc 和 free 也是如此。
让我们考虑一下您的函数 base_add。我不知道它是否“有效”,但有几件事看起来很可疑:
我可以继续,但这应该为您提供一些开始修复代码的地方。
函数 big_add 中还有一些构建警告。看起来这两种情况都不会导致您的症状,但您应该解决它们。
关于c - Xcode调试C语言出现错误: EXC_BAD_ACCESS (code=1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380747/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!