我已经创建了这个代码来测试一个错误,我在主代码中得到了它,并且它共享同样的问题。我总是得到分段错误或损坏的数据(零或奇数)。
以下是代码:
*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'
上出现细分错误。
请注意,我已阅读有关双指针的信息,并尝试按照我找到的所有解决方案,但每次我都会收到此错误。
答案 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;