指向本地范围内结构分段错误数组的指针(C)

时间:2016-10-17 10:24:15

标签: c arrays pointers struct segmentation-fault

我想将数组指针传递给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错误?

2 个答案:

答案 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;
}