linux c malloc段错误,Linux下C编程问题:段错误,Program received signal SIGSEGV, Segmentation fault.请教各位!...

Linux下C编程问题:

段错误,Program received signal SIGSEGV, Segmentation fault.请教各位!

下面是我调试时的一些信息:

[root@localhost Practice]# gcc -o p1 -g p1.c

[root@localhost Practice]# ./p1

段错误

[root@localhost Practice]# gdb p1

GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)

Copyright 2003 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB.  Type "show warranty" for details.

This GDB was configured as "i386-redhat-linux-gnu"...

(gdb) run

Starting program: /usr/Practice/p1

Program received signal SIGSEGV, Segmentation fault.

0x420791b5 in strcat () from /lib/tls/libc.so.6

(gdb) where

#0  0x420791b5 in strcat () from /lib/tls/libc.so.6

#1  0x08048ac4 in __libc_csu_init ()

#2  0x0804872b in main (argc=1, argv=0xbfffdfe4) at p1.c:46

#3  0x42015574 in __libc_start_main () from /lib/tls/libc.so.6

(gdb) list

46                lineBuf = sample("/cpuinfo",1,0);

47                //strcpy(lineBuf,sample("/cpuinfo",1,0));

48                //printf("nCPU Information:n%s",sample("/cpuinfo",1,0));

49                //free(lineBuf);

50                lineBuf = sample("/cpuinfo",4,0);

51                printf("%s",lineBuf);

52                lineBuf = sample("/cpuinfo",6,0);

53                printf("%s",lineBuf);

54                //printf("nKill you!");

55

(gdb)

相关声明:

#define MAX_BUF_LINE 200

char * lineBuf = (char *)malloc(MAX_BUF_LINE);

char * sample(char *,const int,const int);

给lineBuf赋值时出错,

直接printf("nCPU Information:n%s",sample("/cpuinfo",1,0));也出错,

该了好久都没改好,请教大家,谢谢!

|

就错在pathName = strcat("/proc",fileName);这行

首先"/proc",是静态字符串,他的存储空间在编译期间已经分配,大小是固定的

你使用strcat,将fileName向"/proc"后面添加,当然会出错,

另外,你需要仔细阅读一下strcat的用法

|

同意blh(老猫)的说法,你可以

char *tmp=(char *)malloc(100);

memset(tmp,0x0,100);

memcpy(tmp,"/porc",5);

然后将pathName = strcat("/proc",fileName);改为

pathName = strcat(tmp,fileName);

原因同blh(老猫)

|

char * lineBuf = (char *)malloc(MAX_BUF_LINE);

这句话有错,没有告诉运行时库你申请的内存数据是什么类型的,应改为:

char * lineBuf = (char *)malloc(sizeof (char) * MAX_BUF_LINE);

|

sorry,sizeof后面没有空格,敲错了

|

你的strcat在哪儿阿??????

|

把程序贴上来吧,这样看好累呀

|

http://expert.csdn.net/Expert/topic/2426/2426475.xml?temp=.4317896

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1! + 2! + 3! + ... + 20! 的和可以用C语言编写如下代码: ```c #include <stdio.h> int main() { int i, j; long long sum = , fac = 1; for (i = 1; i <= 20; i++) { for (j = 1; j <= i; j++) { fac *= j; } sum += fac; fac = 1; } printf("1! + 2! + 3! + ... + 20! = %lld\n", sum); return ; } ``` 运行结果为: ``` 1! + 2! + 3! + ... + 20! = 2561327494111820313 ``` 其中,使用了两个循环,外层循环控制求和的范围,内层循环计算阶乘。由于20!的值比较大,需要使用long long类型来存储和输出结果。 ### 回答2: 要求求解1!+2!+3!+...+20!的和,首先需要知道什么是阶乘。阶乘表示一个数乘上它本身减1、减2、减3……一直到1的乘积,比如5! = 5*4*3*2*1 = 120。 那么如何计算1!到20!的和呢?我们可以用循环和数组来实现。 首先,定义一个长度为20的数组factorials,用来存放每个数的阶乘。然后,用一个for循环遍历每个数字,计算它的阶乘,并把结果存入数组中。 接着,定义一个变量sum,用来存储阶乘和。再用一个for循环遍历整个数组,把每个数字的阶乘加到sum变量中。 最后,输出sum的值即为1!+2!+3!+...+20!的和。 具体代码如下: #include <stdio.h> int main() { int n = 20; long long factorials[20]; long long sum = 0; factorials[0] = 1; // 0的阶乘等于1 for (int i = 1; i <= n; i++) { factorials[i] = factorials[i - 1] * i; // 计算阶乘 sum += factorials[i]; // 把计算结果累加到sum中 } printf("1!+2!+3!+...+20! = %lld\n", sum); return 0; } 这个程序会输出1!+2!+3!+...+20!的和为2432902008176640000。 ### 回答3: 题目分析: 首先需要明确的是,阶乘的计算过程不难,但是考虑到计算的规模,我们可能需要使用到高精度的数据类型,比如说C语言中自带的 long long 也只能支持到 20! 的计算。所以本题需要使用到高精度计算。 具体思路: 由于本题需要对每一个数都进行阶乘计算,所以处理过程中需要分步骤进行。首先可以定义一个函数,用于计算一个任意大数的阶乘,具体的实现方法可以使用递归,但也可以用循环实现。此外,因为每一次计算阶乘后都要将结果相加,所以可以通过定义一个函数,用于将两个字符串类型的数相加,并且返回一个新的字符串类型结果。需要注意的是,高精度计算的字符相加规则和十进制的普通加法不太相同。 代码实现: 1.计算任意大数的阶乘: ``` char * factorial(const char * num) { //定义一个乘数 int mul = num[0] - '0'; //记录结果和进位 int len = strlen(num), result[len + 1], carry = 0; //将结果清0 memset(result, 0, sizeof(result)); //从个位数开始计算 for (int i = len - 1; i >= 0; i--) { int temp = (num[i] - '0') * mul + carry; result[i + 1] = temp % 10; carry = temp / 10; } result[0] = carry; char * res = (char *) malloc(sizeof(char) * (len + 2)); int i = 0; //移除前导0 while (result[i] == 0 && i < len) i++; for (int j = 0; i <= len; i++, j++) { res[j] = result[i] + '0'; } return res; } ``` 2.将两个字符串类型的高精度数相加: ``` char * stradd(const char * num1, const char * num2) { //获取两个字符串的长度 int len1 = strlen(num1), len2 = strlen(num2), length = max(len1, len2); //定义结果和进位 int result[length + 1], carry = 0; //将结果清0 memset(result, 0, sizeof(result)); //计算结果 for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) { int temp = carry; if (i >= 0) temp += num1[i] - '0'; if (j >= 0) temp += num2[j] - '0'; result[length--] = temp % 10; carry = temp / 10; } //处理最高位 result[length] = carry; //创建结果字符串 char * res = (char *) malloc(sizeof(char) * (strlen(num1) + strlen(num2) + 1)); int i = 0; //移除前导0 while (result[i] == 0 && i < length + 1) i++; for (int j = 0; i <= length; i++, j++) { res[j] = result[i] + '0'; } if (strlen(res) == 0) strcpy(res, "0"); return res; } ``` 3.主函数: ``` int main() { char * res = "1"; //计算1! - 20! 的和 for (int i = 2; i <= 20; i++) { char temp[100] = ""; sprintf(temp, "%d", i); res = strmul(factorial(temp), res); } //打印最终结果 printf("%s", res); return 0; } ``` 通过上述三个函数的组合,我们便可以实现对 1! - 20! 的和的计算,同时也可以支持更大规模的计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值