我想将数组指针传递给C函数,但我一直在分段错误。
所以要点是......
我有一个结构:
static B (*arr_p)[] = NULL;
static B arr[30];
void foo(B **item)
{
printf("cost %d\n",(*item)[0].cost); // seg fault 11 :(
}
int main(int argc, char **argv)
{
arr_p = &arr;
(*arr_p)[0].cost = -1;
printf("Cost %d\n", (*arr_p)[0].cost); // works
foo((B **) arr_p);
}
在主文件中:
<?php
function validateDateTime($dateStr, $format)
{
date_default_timezone_set('UTC');
$date = DateTime::createFromFormat($format, $dateStr);
return $date && ($date->format($format) === $dateStr);
}
// These return true
validateDateTime('2001-03-10 17:16:18', 'Y-m-d H:i:s');
validateDateTime('2001-03-10', 'Y-m-d');
validateDateTime('2001', 'Y');
validateDateTime('Mon', 'D');
validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
validateDateTime('03.10.01', 'm.d.y');
validateDateTime('10, 3, 2001', 'j, n, Y');
validateDateTime('20010310', 'Ymd');
validateDateTime('05-16-18, 10-03-01', 'h-i-s, j-m-y');
validateDateTime('Monday 8th of August 2005 03:12:46 PM', 'l jS \of F Y h:i:s A');
validateDateTime('Wed, 25 Sep 2013 15:28:57', 'D, d M Y H:i:s');
validateDateTime('17:03:18 is the time', 'H:m:s \i\s \t\h\e \t\i\m\e');
validateDateTime('17:16:18', 'H:i:s');
// These return false
validateDateTime('2001-03-10 17:16:18', 'Y-m-D H:i:s');
validateDateTime('2001', 'm');
validateDateTime('Mon', 'D-m-y');
validateDateTime('Mon', 'D-m-y');
validateDateTime('2001-13-04', 'Y-m-d');
有没有办法处理这个讨厌的seg错误?
答案 0 :(得分:2)
您正在将指向数组的指针传递给foo
。您应该更改foo
的定义以接受指向数组的指针。
更改
void foo(B **item)
{
printf("cost %d\n",(*item)[0].cost); // seg fault 11 :(
}
到
void foo(B (*item)[])
{
printf("cost %d\n",(*item)[0].cost); // seg fault 11 :(
}
由于foo((B **) arr_p);
中的强制转换,问题被屏蔽了。如果没有强制转换,您会在该行上收到警告。将类似警告强制转换通常不是一个好主意。在这种情况下,它会导致分段错误。
答案 1 :(得分:0)
为简单起见,您可以对指针和函数定义使用相同的声明语法:
struct B {
int cost;
};
static struct B array[30];
static struct B (*arr_p)[] = NULL;
/* Note the similarity in syntax: */
void f(struct B (*array)[],
/* ..and keep the array size to avoid common mistakes: */
size_t array_size) {
printf("%d\n", (*array)[1].cost);
}
int main (int argc, char **argv)
{
arr_p = &array;
f(arr_p, sizeof array / sizeof *array);
return EXIT_SUCCESS;
}