【问题标题】:C program - Seg fault, cause ofC 程序 - 段错误,原因
【发布时间】:2012-12-08 10:57:40
【问题描述】:

当我输入 6 (int) 作为值时,运行它会给我一个 seg 错误 (gcc filename.c -lm)。请帮我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经陷入了段错误。

谢谢!

#include<stdio.h>
#include<math.h>
int main (void)
{
  int l = 5;
  int n, i, tmp, index;
  char * s[] = {"Sheldon", "Leonard", "Penny", "Raj", "Howard"};
  scanf("%d", &n);

  //Solve Sigma(Ai*2^(i-1)) = (n - k)/l     

  if (n/l <= 1)
    printf("%s\n", s[n-1]); 
  else
    {
      tmp = n;
      for (i = 1;;)
    {
      tmp = tmp - (l * pow(2,i-1));
      if (tmp <= 5) 
        {
          // printf("Breaking\n");
          break;
        }
      ++i;
    }
      printf("Last index = %d\n", i);   //  ***NOTE***

      //Value lies in next array, therefore
      ++i;

      index = tmp + pow(2, n-1);
      printf("%d\n", index);

    }
  return 0;
}

【问题讨论】:

  • 这是 codeforces 的问题吗? :) 我记得我解决了这个问题..

标签: c segmentation-fault


【解决方案1】:

当您为 ns[n-1] 输入 6 时,您正在执行越界访问:

printf("%s\n", s[n-1]); 

因为数组中只有 5 个指针。所以只有 0-4 是有效的索引。

【讨论】:

  • if (6 / 5 true, s[5] 越界,, s[0] ~ s[4]
  • 啊 6/5 = 1。认为它会 > 1 并转到 else 条件。对不起。谢谢你!
  • 感谢赖医生!大脑冻结:(
  • 我很乐意这样做。但似乎我必须等待 5 分钟才能将其标记为已解决!现在还有 30 秒...
【解决方案2】:

你正在使用 pow 函数,效率不高。

这是我在 Python 中的解决方案。

from math import ceil

names = ['Sheldon', 'Leonard', 'Penny', 'Rajesh', 'Howard']

n = int(raw_input())

i = 0
j = 1
k = len(names)

while i <= n:
    i += k
    k += k
    j += j

print names[int(ceil((n - (i - k * 0.5)) / (j * 0.5)) - 1)]

我希望这会有所帮助。

【讨论】:

  • 我的天,赖医生!那是你得到的一些优雅的代码。你这个杀手:)。干杯!
  • 我相信有O(1)算法,但我不知道..这已经够快了。
  • 这简直是疯子。喜欢你的网站。除了它,你还知道其他什么地方可以改善我的思维吗?
  • 没问题....看来我已经失去了两个声誉,因为我在这里发布了这个程序。 :(
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 2018-04-09
  • 2011-07-12
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多