动态内存与指针问题:两个数组存储函数一正常一异常求助
Hey there! Let's dig into your problem with those two array-storing functions. First off, even though your StoreinArray1 is working right now, it's hiding some bugs that could bite you later. Then, since your StoreinArray2 code is incomplete, I'll walk through the most common reasons it might be failing and how to fix it.
Your current code runs, but these gaps could cause crashes or unexpected behavior down the line:
- No check for successful file opening: If
fopen()fails (say, the file doesn't exist or you don't have permission),fwill beNULL, and the subsequentfscanf()will crash your program. - Pointer changes don't propagate back to
main: SinceXis passed by value, when you assign the result ofrealloc()toXinside the function, that change won't affect the original pointer inmain. Ifrealloc()returns a new memory address, you'll end up with a memory leak andmainwill still reference the old (potentially invalid) address. - Unclosed file handle: You open the file but never call
fclose(f), which wastes system resources over time.
Here's the fixed version of StoreinArray1 that addresses all these issues:
int StoreinArray1(int **X, int *size, char *file) { int i; FILE *f = fopen(file, "r"); // Check if file opened successfully if (!f) { perror("Failed to open file"); return 0; } // Use a double pointer so changes to X reach main *X = realloc(*X, *size * sizeof(int)); if (!*X) { perror("Failed to reallocate memory"); fclose(f); return 0; } // Read integers and verify each read for (i = 0; i < *size; i++) { if (fscanf(f, "%d", &(*X)[i]) != 1) { fprintf(stderr, "Failed to read integer at index %d\n", i); fclose(f); return 0; } } fclose(f); // Clean up the file handle return 1; }
When calling this fixed function, you'll need to pass a pointer to your array pointer:
StoreinArray1(&X, &size, "your_file.txt");
StoreinArray2 Might Be Failing Since your StoreinArray2 code is cut off, I'll cover the most common pitfalls that would break a function with this purpose:
1. File Pointer Position Problems
If StoreinArray2 takes a FILE *f parameter (instead of a filename), the file pointer is already at the end of the file after StoreinArray1 finishes reading. Trying to read from there will immediately fail because there's no data left. Fix this by resetting the file pointer before calling StoreinArray2:
// In main, before calling StoreinArray2 rewind(f); // Or fseek(f, 0, SEEK_SET); StoreinArray2(X, size, f);
2. Mismatched Parameters
If StoreinArray2 has a different parameter signature than StoreinArray1 (e.g., one uses a filename string, the other uses a file pointer) but you're passing the same argument in main, you'll get compilation errors or runtime crashes. Double-check that your function parameters match what you're passing in the call.
3. Same Pointer/Resource Management Bugs as StoreinArray1
If StoreinArray2 repeats the same mistakes as the original StoreinArray1 (like not using a double pointer for X, skipping error checks, or leaving files open), it will fail in the same (or worse) ways.
Example of a Working StoreinArray2 (Using File Pointer)
Here's a complete version that fixes these common issues:
int StoreinArray2(int **X, int *size, FILE *f) { if (!f) { fprintf(stderr, "Invalid file pointer\n"); return 0; } // Reset file pointer to start for fresh read rewind(f); *X = realloc(*X, *size * sizeof(int)); if (!*X) { perror("Failed to reallocate memory"); return 0; } int i; for (i = 0; i < *size; i++) { if (fscanf(f, "%d", &(*X)[i]) != 1) { fprintf(stderr, "Failed to read integer at index %d\n", i); return 0; } } return 1; }
内容的提问来源于stack exchange,提问作者Merlin

