我有以下代码:
<?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 ++,因此它变得一团糟。
答案 0 :(得分:2)
float** matrix = (float**)(float*) malloc(height*sizeof(float));
而不是sizeof(float)
使用sizeof(float *)
。您需要为height
个float
指针分配内存。
所以你的代码是这样的 -
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]
是“指向浮点数”的指针。