关于指针和分段错误

时间:2015-12-01 05:51:53

标签: c pointers segmentation-fault

关于指针和分段错误的问题。

3 个答案:

答案 0 :(得分:1)

考虑一下:

dir_name = strcat(".beargit/", commit_id);

您正在尝试将commit_id添加到常量字符串的末尾。该字符串可能在只读内存中,并且尝试修改它会导致未定义的行为 - 在您的情况下,是一个分段错误。充其量只会导致未定义的行为,尽管有一个强有力的论据,即分段错误是好的,因为你不能忽视这样一个问题。

  

我该如何解决?

您目前有:

char* dir_name = malloc(strlen(commit_id) + 10);
dir_name = strcat(".beargit/", commit_id);

如果你没有崩溃,你就会泄漏新分配的内存。你应该使用:

char* dir_name = malloc(strlen(commit_id) + 10);
if (dir_name == 0)
    …report error and exit…Do not pass Go; Do not collect $200…
strcpy(dir_name, ".beargit/");
strcat(dir_name, commit_id);

或者:

sprint(dir_name, ".beargit/%s", commit_id);

毫无疑问,其他方式也可以找到。我很想将[{1}}中的10替换为正确大小的malloc(); sizeof(".beargit/")运算符在返回的长度中包含终结null。

别忘了释放分配的内存!

答案 1 :(得分:1)

@Jonathan Leffler正确地指出,“。beargit /”是只读的,而strcat会失败,因为它无法附加到只读段。

  char breargit_buffer[256] = ".beargit/"; // allocate some large enrough non read only buffer

  dir_name = strcat(breargit_buffer, commit_id);

答案 2 :(得分:0)

您的<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:useDefaultMargins="true" android:alignmentMode="alignBounds" android:columnOrderPreserved="false" android:columnCount="2" android:orientation="horizontal" android:rowCount="7" android:paddingTop="6dp"> <ImageView android:id="@+id/imgWriteFeedback" android:layout_width="wrap_content" android:layout_gravity="left" android:layout_row="0" android:layout_column="0" android:src="@drawable/write_to_us" android:paddingTop="6dp" android:paddingLeft="6dp" android:paddingRight="6dp" android:paddingBottom="6dp"/> <TextView android:id="@+id/lblWriteFeedback" android:layout_row="0" android:layout_column="1" android:textSize="20sp" android:gravity="left" android:textColor="@android:color/black" android:layout_marginLeft="5dp" android:text="@string/write_to_us" android:paddingTop="6dp" android:layout_gravity="left" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="1px" android:layout_marginTop="3dp" android:background="@color/frame_background" android:orientation="horizontal" android:layout_columnSpan="2"/> <ImageView android:id="@+id/imgRateUs" android:layout_width="wrap_content" android:layout_gravity="left" android:layout_row="1" android:layout_column="0" android:src="@drawable/rate_us_resized" android:paddingTop="6dp" android:paddingLeft="6dp" android:paddingRight="6dp" android:paddingBottom="6dp"/> <TextView android:id="@+id/lblRateUs" android:layout_row="1" android:layout_column="1" android:textSize="20sp" android:gravity="left" android:textColor="@android:color/black" android:layout_marginLeft="5dp" android:paddingTop="6dp" android:text="@string/rate_us" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="1px" android:layout_marginTop="3dp" android:background="@color/frame_background" android:orientation="horizontal" android:layout_columnSpan="2"/> <ImageView android:id="@+id/imgShareApp" android:layout_width="wrap_content" android:layout_gravity="left" android:layout_row="2" android:layout_column="0" android:src="@drawable/share_resized" android:paddingTop="6dp" android:paddingLeft="6dp" android:paddingRight="6dp" android:paddingBottom="6dp"/> <TextView android:id="@+id/lblShareApp" android:layout_row="2" android:layout_column="1" android:textSize="20sp" android:gravity="left" android:textColor="@android:color/black" android:layout_marginLeft="5dp" android:paddingTop="6dp" android:text="@string/share_app" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="1px" android:layout_marginTop="3dp" android:background="@color/frame_background" android:orientation="horizontal" android:layout_columnSpan="2"/> </GridLayout> 参数已被撤消。它是strcat

尝试:

strcat(destination, source)