重新分配函数后的分段错误

时间:2017-07-09 06:07:57

标签: c pointers realloc double-pointer

我已经创建了这个代码来测试一个错误,我在主代码中得到了它,并且它共享同样的问题。我总是得到分段错误或损坏的数据(零或奇数)。

以下是代码:

*point[1]=777;

我在point[1]=777;上遇到了细分错误。如果我试图像int func (int **point);这样做,我会收到错误的数据。 func(&p);realloc中的任何更改都会导致 apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.1" useLibrary 'org.apache.http.legacy' defaultConfig { applicationId "com.bluehorntech.drapplication" minSdkVersion 10 targetSdkVersion 25 versionCode 1 versionName "1.0" multiDexEnabled true } dexOptions { javaMaxHeapSize "2g" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } repositories { maven { url "https://raw.githubusercontent.com/smilefam/SendBird-SDK-Android/master/" } } dependencies { compile 'com.mcxiaoke.volley:library:1.0.6@aar' compile files('libs/httpmime-4.1.3.jar') compile 'com.android.support:multidex:1.0.1' compile project(':datetimepicker-library') compile fileTree(include: ['*.jar'], dir: 'libs') // compile files('src/libs/org.apache.http.legacy.jar') // compile fileTree(dir: 'libs', include: 'Parse-*.jar') compile project(':library') //noinspection GradleCompatible compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.android.support:cardview-v7:23.1.1' // compile 'com.parse.bolts:bolts-android:1.+' compile 'com.google.android.gms:play-services:9.0.0' compile 'com.jakewharton:butterknife:5.1.1' compile 'com.google.android.gms:play-services-ads:9.0.0' compile 'com.google.android.gms:play-services-auth:9.0.0' compile 'com.google.android.gms:play-services-gcm:9.0.0' compile 'com.google.firebase:firebase-core:9.0.0' compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.sendbird.sdk:sendbird-android-sdk:3.0.10' /*ald*/ compile 'com.nineoldandroids:library:2.4.0' compile 'com.github.sd6352051.niftydialogeffects:niftydialogeffects:1.0.0@aar' } apply plugin: 'com.google.gms.google-services' 上出现细分错误。

请注意,我已阅读有关双指针的信息,并尝试按照我找到的所有解决方案,但每次我都会收到此错误。

1 个答案:

答案 0 :(得分:8)

您的问题是运营商优先级,将*point[0]更改为(*point)[0]等等。

你现在拥有的是*(point[0])。您将指向单个元素的指针视为指向多个连续元素的指针,然后将某些不确定值取消引用作为地址。这导致了未定义的行为,幸运的是,这表现为崩溃。

更改后,您首先取消引用 point,然后使用该地址索引您分配的连续元素。

两项改进建议:

请勿将realloc的结果直接分配给*point。如果调用失败,则泄漏原始内存。首先将其分配给临时用于验证。

另外,尽量不要重复类型。而不是sizeof(int)尝试sizeof(**point),即输出缓冲区应该指向的是什么。这样,如果您将类型从int更改为其他内容,则代码中不会出现无提示错误。

void *point_check = realloc(*point,sizeof(**point)*4);
if (point_check == NULL){
    printf("\n abort \n");
    exit(0); // If this ever returns instead of exit, `*point` will not leak
}
*point = point_check;