1. 程式人生 > >ide 與 leetcode 執行結果不一樣

ide 與 leetcode 執行結果不一樣

在做 leetcode 的第 15 題3Sum 時發現,同樣的程式碼在本地執行的結果是正確的,而在 leetcode 的伺服器上結果卻是錯誤的。而且檢查了程式中,也並沒有使用全域性或者靜態變數。

這裡寫圖片描述

通過列印,仔細對比兩種環境下的輸出發現,原來是程式碼有一條語句指標指向了陣列外邊的第一個地址。語句的內容是比較當前地址的值是否和後一個地址的值相同, 由於後一個地址實際上已經發生了溢位,在當前地址為陣列最後一個元素時,下一個地址就在陣列外邊了,這個地址的值是不確定的。在本地除錯時,由於兩個地址的值不同,所以程式結果正確,而在 leetcode 伺服器上執行時,這兩個值相同,因此程式最終的結果就錯誤了。

這裡寫圖片描述

下面是完整程式碼,出錯的程式碼在第 62 行。

/*
* @Author: cyang
* @Date:   2018-08-06 16:26:59
* @Last Modified by:   cyang
* @Last Modified time: 2018-09-15 14:55:12
*/

#include <stdio.h>
#include <stdlib.h>

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int** threeSum(int* nums, int numsSize, int* returnSize) { int **return_array = (int **)malloc(sizeof(int *) * numsSize * (numsSize-1)); qsort(nums, numsSize, sizeof(int), cmpfunc); int *start, *end; int rerurn_size = 0; int temp = 0; for (int i = 0; i < numsSize-2; ++i) { if
(nums[i-1] == nums[i] && i > 0) continue; printf("=======================================\n"); start = &nums[i+1]; end = &nums[numsSize-1]; while(start < end) { printf("%d %d %d %d \n", i, nums[i], *start, *end); temp = *start + *end + nums[i]; if(temp == 0) { // printf("%d %d %d %d \n", i, nums[i], *start, *end); return_array[rerurn_size] = (int *)malloc(sizeof(int) * 3); return_array[rerurn_size][0] = nums[i]; return_array[rerurn_size][1] = *start; return_array[rerurn_size][2] = *end; rerurn_size++; while(*start == *(start+1)) { printf("+\n"); start++; } #if 1 //ringht while((*end == *(end+1)) && (end != &nums[numsSize-1])) #else //wrong while(*end == *(end+1)) #endif { printf("-\n"); end--; } start++; end--; } else if (temp < 0) { start++; } else // > 0 { end--; } printf("%p, %p\n", start, end); } } *returnSize = rerurn_size; printf("rerurn_size = %d\n", rerurn_size); return return_array; } int nums[] = {1, -4, -4, 2, 0, 0, -2, 3, 3, -3, -4}; int main(int argc, char const *argv[]) { // int nums[] = {-1, 0, 1, 2, -1, -4}; // int nums[] = {0, 0, 0, 0}; // int nums[] = {1, -1, -1, 0}; // int nums[] = {-2, 0, 0, 2, 2}; // int nums[] = {-2, 0, 1, 1, 2}; // int nums[] = {1, -4, -4, 2, 0, 0, -2, 3, 3, -3, -4}; int numsSize = sizeof(nums)/sizeof(int); int returnSize = 0; int **return_array = NULL; return_array = threeSum(nums, numsSize, &returnSize); printf("\n"); if(return_array == NULL) return 0; for (int i = 0; i < returnSize; ++i) { for (int j = 0; j < 3; ++j) { printf("%d ", return_array[i][j]); } printf("\n"); } for (int i = 0; i < returnSize; ++i) { free(return_array[i]); } // system("pause"); return 0; }