C 这就是他们所说的“a”吗;堆栈溢出";?

C 这就是他们所说的“a”吗;堆栈溢出";?,c,arrays,stack-overflow,C,Arrays,Stack Overflow,所以我一直在尝试用C实现Euler项目,因为我是一个受虐狂,但实际上一直进展得很顺利,直到: int问题\u 8(){ int max=0; 常量字符*nums[]={“7316717653133062491922511967446574742355349194934” "96983520312774506326239578318016984801869478851843" "85861560789112949495459501737958331952853208805511" "1254069

所以我一直在尝试用C实现Euler项目,因为我是一个受虐狂,但实际上一直进展得很顺利,直到:

int问题\u 8(){
int max=0;
常量字符*nums[]={“7316717653133062491922511967446574742355349194934”
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450"};
对于(int i=0;i<996;i++){
int k=1;
对于(int j=0;j<5;j++){
k*=atoi(nums[i+j]);
}
如果(k>max)
max=k;
}
返回最大值;
} 
当我调用
problem_8()
时,该程序立即崩溃。Google说我应该在堆上动态创建数组,而不是使用堆栈,但我一直很难弄清楚如何做到这一点,因为我从来没有真正接触过动态内存分配(我来自Java背景)。我是否只使用malloc()为数组分配一个千字节的内存?我如何做到这一点


EDIT:所以结果是
const char*nums[]
应该是
const char nums[]
,而不是
atoi(nums[i+j])
我应该使用
nums[i+j]-'0'
,现在它可以正常工作了。忽略所有告诉我在数组中添加逗号的答案。

这与堆栈溢出无关

它崩溃是因为您正在访问
nums
中不存在的条目。 更准确地说,
nums
是一个字符串数组,只包含一个字符串,
nums[0]
。 使用
const char*nums=
修复此问题


您还需要将
atoi
调用更改为
nums[i+j]-“0”

这与堆栈溢出无关

它崩溃是因为您正在访问
nums
中不存在的条目。 更准确地说,
nums
是一个字符串数组,只包含一个字符串,
nums[0]
。 使用
const char*nums=
修复此问题


您还需要将
atoi
调用更改为
nums[i+j]-'0'

呃,您意识到这是一个单元素数组,对吗?因此,只要您使用除0以外的任何内容进行索引,您就超出了范围并导致未定义的行为。我猜你少了逗号

我没有阅读问题的要求;如果假定它是一个长字符串,那么
nums
的类型是错误的。它应该是一个字符数组:

const char nums[] = "...
const char *nums[] = "...
           ^
           |
      has meaning!
不是指向
char
的指针数组:

const char nums[] = "...
const char *nums[] = "...
           ^
           |
      has meaning!

你知道这是一个单元素数组,对吗?因此,只要您使用除0以外的任何内容进行索引,您就超出了范围并导致未定义的行为。我猜你少了逗号

我没有阅读问题的要求;如果假定它是一个长字符串,那么
nums
的类型是错误的。它应该是一个字符数组:

const char nums[] = "...
const char *nums[] = "...
           ^
           |
      has meaning!
不是指向
char
的指针数组:

const char nums[] = "...
const char *nums[] = "...
           ^
           |
      has meaning!

固定版本如下所示

...
for (int i = 0; i < 996; i++) {
    int k = 1;
    for (int j = 0; j < 5; j++) {
        k *= nums[i+j]-'0';
    }
    if (k > max)
        max = k;
}
...
。。。
对于(int i=0;i<996;i++){
int k=1;
对于(int j=0;j<5;j++){
k*=nums[i+j]-'0';
}
如果(k>max)
max=k;
}
...

它找到的最大值是40824。

固定版本如下所示

...
for (int i = 0; i < 996; i++) {
    int k = 1;
    for (int j = 0; j < 5; j++) {
        k *= nums[i+j]-'0';
    }
    if (k > max)
        max = k;
}
...
。。。
对于(int i=0;i<996;i++){
int k=1;
对于(int j=0;j<5;j++){
k*=nums[i+j]-'0';
}
如果(k>max)
max=k;
}
...

找到的最大值为40824。

否,这不是堆栈溢出,而是逻辑错误,请尝试添加逗号。

否,这不是堆栈溢出,而是逻辑错误,尝试添加逗号。

我得到
警告:字符串长度“1000”大于长度“509”,需要ISO C90编译器支持
。这似乎是一个很好的警告。在字符串数组中的字符串之间添加逗号。@moeCake:这是一个数字:“1000位数字中的五个连续数字”,per。最好是
static const char*nums=…
。然后使用
nums[i]-“0”
获取位置
i
处的值。我获取
警告:字符串长度“1000”大于长度“509”,ISO C90编译器需要支持
。这似乎是一个很好的警告。在字符串数组中的字符串之间添加逗号。@moeCake:这是一个数字:“1000位数字中的五个连续数字”,per。最好是
static const char*nums=…
。然后使用
nums[i]-“0”
获取位置
i
处的值。但是我认为C字符串可以声明为数组