C - 2D阵列分段故障

时间:2016-03-30 16:43:29

标签: c arrays segmentation-fault

我有以下代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"
    android:paddingBottom="12dp"
    android:paddingTop="12dp">

    <android.support.v7.widget.SwitchCompat
        android:id="@+id/mySwitch"
        android:layout_width="match_parent"
        android:switchMinWidth="56dp"
        android:layout_height="wrap_content"
        android:switchTextAppearance="@style/SwitchTextAppearance"
        android:thumb="@drawable/thumb"
        android:track="@drawable/track"
        app:showText="true"
        android:textOn="ON"
        android:textOff="OFF"
        android:text="Toggle Switch"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:background="@android:color/transparent"
        android:button="@null"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"/>

</RelativeLayout>

我正在尝试创建一个2D数组并初始化它,但是在循环中设置matrix [6] [0]的值时会收到分段错误。我发现非常奇怪的是当我在循环外设置矩阵[6] [0]时不会抛出错误。我的理解是,当访问非法内存时会发生分段错误,但我找不到为什么在循环内访问不同内存的原因。我甚至检查了汇编代码,找出发生了什么,但我找不到问题。

更新:代码是CUDA程序(C ++)的一部分,但是我的大脑一半都在考虑C和一半关于C ++,因此它变得一团糟。

2 个答案:

答案 0 :(得分:2)

float** matrix = (float**)(float*) malloc(height*sizeof(float));

而不是sizeof(float)使用sizeof(float *)。您需要为heightfloat指针分配内存。

所以你的代码是这样的 -

float** matrix = malloc(height*sizeof(float *));

您的代码在使用循环时会产生seg错误,因为您没有更正float指针的内存量,并且您最终访问了无效内存,从而获得未定义的行为

注意 - 请勿对malloc使用强制转换。并查看retrun的{​​{1}}。

答案 1 :(得分:2)

以下是精炼代码:

int width = 10;
int height = 9;

float **matrix = malloc(height * sizeof (float *));

for (size_t i = 0; i < height; i++)
    matrix[i] = malloc(width * sizeof(float));

matrix是“指向指向浮点数的指针”的指针,而matrix[i]是“指向浮点数”的指针。