linux c语言编程提示:段错误 核心已转储 编译没有问题 在运行时会提示段错误 请教各位大神!

m0_37789286 2017-03-14 08:18:27
把一个一列10行的数组 编程一个m行n列的数组 reshape函数
代码:
#include<stdio.h>
int reshape (int *fp,int m,int n)
{ int new[m][n];
int i;
int j;


for(j=0;j<n;j++)
for(i=0;i<m;i++)
{
new[i][j]=*fp;
fp++;
}
return (new[m][n]);

}
void main ()
{
int i,j;
int *p;
int pai[10][1]={{1},{2},{3},{4},{5},{6},{7},{8},{9},{0}};
int new1[2][5];
p=&pai[0][0];
new1[2][5]=reshape(p,2,5);
for(i=0;i<2;i++)
for(j=0;j<5;j++)
printf("%4d",new1[i][j]);
}
~
...全文
353 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-03-17
  • 打赏
  • 举报
回复
引用 7 楼 m0_37789286 的回复:
[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 m0_37789286 的回复:] 感谢你的回复!恩是数组越界了,我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊,看不懂。。。还望解答 感谢!
这个是一个数组指针,很容易和它混淆的是一个指针数组:
int *array[10];
这个就是指针数组; 数组指针,是指向数组的指针,并且指向的数组是列数为COL长度的数组。[/quote] 您好 我在问一下 回去我仔细看了一下这种数组指针 又称行指针 但是不明白它相对于列指针的好处在哪里 我们为什么要用它呢?就像这个程序里 难道必须要用它吗 不能用别的吗 还请你帮我解答一下 谢谢![/quote] 这个是传递一个二维数组到一个函数里用到的,你可以用int dst[][COL],但是这种形式编译器也是以指针形式处理的。与其让编译器“翻译”不如一步到位。
m0_37789286 2017-03-16
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
[quote=引用 2 楼 m0_37789286 的回复:] 感谢你的回复!恩是数组越界了,我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊,看不懂。。。还望解答 感谢!
这个是一个数组指针,很容易和它混淆的是一个指针数组:
int *array[10];
这个就是指针数组; 数组指针,是指向数组的指针,并且指向的数组是列数为COL长度的数组。[/quote] 您好 我在问一下 回去我仔细看了一下这种数组指针 又称行指针 但是不明白它相对于列指针的好处在哪里 我们为什么要用它呢?就像这个程序里 难道必须要用它吗 不能用别的吗 还请你帮我解答一下 谢谢!
m0_37789286 2017-03-15
  • 打赏
  • 举报
回复
谢谢你的回答,成功解决!感谢感谢,
弯曲时空Crape 2017-03-15
  • 打赏
  • 举报
回复
最后提醒一个事情,楼主用的是C语言不是Java语言,main函数的返回类型不能是void,必须是int。
自信男孩 2017-03-15
  • 打赏
  • 举报
回复
引用 2 楼 m0_37789286 的回复:
感谢你的回复!恩是数组越界了,我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊,看不懂。。。还望解答 感谢!
这个是一个数组指针,很容易和它混淆的是一个指针数组:
int *array[10];
这个就是指针数组; 数组指针,是指向数组的指针,并且指向的数组是列数为COL长度的数组。
m0_37789286 2017-03-15
  • 打赏
  • 举报
回复
感谢你的回复!恩是数组越界了,我想问一下你那个参考程序reshape函数里行参int (*dst)[COL]是什么意思啊,看不懂。。。还望解答 感谢!
赵4老师 2017-03-15
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令 以下内容摘自gdb常用命令: watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a 2. 设置观察点(WatchPoint) 观察点一般用来观察某个表达式(变量也是一种表达式)的值是否变化了。如果有变化,马上停住程序。有下面的几种方法来设置观察点: watch <expr> 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。 rwatch <expr> 当表达式(变量)expr被读时,停住程序。 awatch <expr> 当表达式(变量)的值被读或被写时,停住程序。 info watchpoints 列出当前设置的所有观察点。
自信男孩 2017-03-14
  • 打赏
  • 举报
回复
问题: 1. main 函数里,new1数据长度是2行5列,用数组new1接收存在数组越界,即new1下标是行0,1;列0~4; 2. reshape返回局部变量,当函数结束时局部变量就会自动释放,所以不能返回局部数组。 3. 段错误应该是数组越界导致的。两个函数都存在数组越界。
#include<stdio.h>

#define ROW     2
#define COL     5

int reshape (int *src, int len, int (*dst)[COL], int row, int col)
{  
    int i, j, k = 0;

    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            if (k < len)
                dst[i][j] = src[k++];
}
 int  main ()
  {
   int i,j;
   int pai[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
   int dst[2][5];
   
   reshape(pai, 10, dst, ROW, COL);
    for(i = 0; i < ROW; i++)
        for(j = 0; j < COL; j++)
            printf("%4d ", dst[i][j]);
    printf("\n");
  }
这是我改的版本,参考一下吧

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧