【问题标题】:Segmentation fault occurs in C programC程序出现分段错误
【发布时间】:2016-06-25 17:19:03
【问题描述】:

我正在尝试解决黑客级别的问题。当我在本地系统上运行以下代码时,它没有显示任何错误。但是当我提交它时,它显示segmentation fault

它接受了第一个测试用例,但剩余的测试用例确实导致segmentation fault

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    int n,q,i,j;
    scanf("%d %d",&n,&q);

    int k,l,m,seq,lastAns=0;
    int **arr;
    arr=(int **) malloc(sizeof(int )*n);

    if(!arr) return 0;

    arr[0] = (int *) malloc(sizeof(int )*q*n);

    for(i = 0; i < n; i++)
        arr[i] = *arr + i*q ; 

    if(!*arr) return 0;

    for(i = 0; i < q ; i++)
    {
        scanf("%d%d%d",&k,&l,&m);
        switch (k)
        {
            case 1:  seq= (l^lastAns)%n;
                for(j = 0 ; j < q; j++)
                {
                    if(!arr[seq][j]) 
                    {
                         arr[seq][j]=m; 
                         break; 
                    }
                }
                break;
            case 2:  
                seq= (l^lastAns)%n;
                lastAns = arr[seq][m % n];
                printf("%d\n", lastAns);
                break;
        }
   }   
   free(arr[0]);
   free(arr);       
   return 0;
}  

【问题讨论】:

  • arr=(int **) malloc(sizeof(int )*n); -->> arr= (int **) malloc(sizeof(int* )*n); -->> arr=(int **) malloc(n * sizeof *arr); ->> arr= malloc(n * sizeof *arr);
  • 问问自己你希望用(int **) malloc(sizeof(int )*n);完成什么?
  • 我要为n个双指针分配内存

标签: c segmentation-fault


【解决方案1】:

正如sjsam所指出的,这个说法是错误的:

arr=(int **) malloc(sizeof(int )*n);

您的程序在 sizeof(int) == sizeof(int*) 的系统上运行(即 32 位系统),但在 64 位系统上可能会失败(sizeof(int) == 4sizeof(int*) == 8

我想通过 q​​ 动态创建一个维度为 n 的二维数组

我们明白这一点,而您已经在这里创建了这样一个数组:

arr[0] = (int *) malloc(sizeof(int )*q*n);

但是你在问题陈述中创建了一些东西else;即n 指针 的数组,而不是n 整数的数组。

【讨论】:

  • 感谢您的帮助。我想通过 q​​ 动态创建一个维度为 n 的二维数组。
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2015-03-20
  • 2013-09-13
  • 2018-03-29
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多