如何解决HackerRank中“~ no response on stdout ~”输出无响应错误?
The Root Cause: Wrong Function Argument
That silent failure with no output comes down to a critical mistake when you call your func in main:
func(**arr);
Here, **arr grabs the very first integer in your 2D array (arr[0][0]), but your func expects a 2D array (or pointer to an array). Passing a single integer where an array is required makes all the index operations inside func point to random memory locations—this is undefined behavior, which usually means the program crashes before it even gets to the printf line. No wonder you see nothing on stdout!
Step-by-Step Fixes
1. Fix the Function Call First
Change the call in main to pass the actual 2D array pointer:
func(arr);
But wait—your func is declared to take int arr[][100], but arr in main is an int** (pointer to pointer). These types aren't compatible, so we need to adjust either the function or how you create the array.
2. Update the Function Parameter to Match Dynamic Arrays
Since you're using dynamically allocated memory for the 2D array, rewrite func to accept an int**:
void func(int** arr) { int hgs[4][4]; int i, j; // Calculate all hourglass sums for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { hgs[i][j] = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+1] + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2]; } } // Find the maximum sum int max = hgs[0][0]; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (hgs[i][j] > max) max = hgs[i][j]; } } printf("%d\n", max); // Add newline to match HackerRank's output requirements }
Adding the newline \n to printf is a small but important detail—some online judges reject outputs that don't end with a newline.
3. Optional: Simplify with a Static Array
If you don't need dynamic allocation, you can declare a static 6x6 array in main which makes parameter passing cleaner:
int main() { int arr[6][6]; // Static 6x6 array for (int i = 0; i < 6; i++) { char **arr_item_temp = split_string(readline()); for (int j = 0; j < 6; j++) { char* arr_item_endptr; char* arr_item_str = *(arr_item_temp + j); int arr_item = strtol(arr_item_str, &arr_item_endptr, 10); if (arr_item_endptr == arr_item_str || *arr_item_endptr != '\0') { exit(EXIT_FAILURE); } arr[i][j] = arr_item; } } func(arr); return 0; } // Now func can use a compatible array parameter void func(int arr[][6]) { // Same hourglass calculation logic as before }
Test with Your Sample Input
Using the sample input you provided (1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0), the fixed code will correctly compute the maximum hourglass sum of 19 and print it as expected.
Quick Extra Tips
- While HackerRank doesn't enforce it, get in the habit of freeing dynamically allocated memory to avoid leaks (add
freecalls for each row and the top-level pointer at the end ofmain). - Your
split_stringfunction returns NULL if memory allocation fails—adding a check for that would prevent potential crashes from invalid inputs.
内容的提问来源于stack exchange,提问作者aditya




