新手求教:基础C语言代码触发Access violation的原因及修复方案
Hey there! As someone who’s stumbled through this exact error while learning C, I totally get how frustrating it can feel. Let’s break down what’s usually causing that "Access violation" message and how to fix it.
1. Dereferencing a Null Pointer
This is one of the most common culprits. When you declare a pointer but don’t point it to valid memory, then try to write to or read from it, your program tries to access memory address 0—which is off-limits.
Bad Code Example:
#include <stdio.h> int main() { int *ptr = NULL; *ptr = 10; // Boom! Access violation here return 0; }
Fix:
Either point the pointer to an existing variable, or dynamically allocate memory with malloc (and always check if allocation succeeded):
#include <stdio.h> #include <stdlib.h> int main() { // Option 1: Point to a real variable int num = 0; int *ptr = # *ptr = 10; // Works perfectly // Option 2: Allocate memory dynamically int *dyn_ptr = (int*)malloc(sizeof(int)); if (dyn_ptr != NULL) { // Never skip this check! *dyn_ptr = 20; free(dyn_ptr); // Don't forget to clean up later } return 0; }
2. Out-of-Bounds Array Access
C doesn’t do automatic bounds checking for arrays. If you try to access an index that’s beyond the array’s actual length, you’ll end up writing to or reading from memory that doesn’t belong to your program.
Bad Code Example:
#include <stdio.h> int main() { int arr[5] = {1,2,3,4,5}; printf("%d", arr[10]); // Index 10 is way beyond the array's size (0-4) return 0; }
Fix:
Always make sure your array indices stay between 0 and array_length - 1. Use clear loop conditions if you’re iterating:
#include <stdio.h> int main() { int arr[5] = {1,2,3,4,5}; for (int i = 0; i < 5; i++) { // Stops at index 4, which is valid printf("%d ", arr[i]); } return 0; }
3. Using a Dangling Pointer (Accessing Freed Memory)
If you free memory that a pointer points to, but don’t update the pointer, it becomes a "dangling pointer"—pointing to memory that’s no longer yours to use. Accessing it will cause an error.
Bad Code Example:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr = (int*)malloc(sizeof(int)); free(ptr); // Memory is returned to the system *ptr = 5; // Trying to use freed memory = access violation return 0; }
Fix:
After freeing memory, set the pointer to NULL. Then, always check if the pointer is non-null before using it:
#include <stdio.h> #include <stdlib.h> int main() { int *ptr = (int*)malloc(sizeof(int)); if (ptr != NULL) { free(ptr); ptr = NULL; // Reset to null so we know it's invalid } // Later, if we need to use it again: if (ptr != NULL) { *ptr = 5; // This won't run, avoiding the error } return 0; }
4. Trying to Modify Read-Only Memory
String literals (like "Hello World") are stored in read-only memory. If you try to change them directly, your program will get blocked from writing to that protected space.
Bad Code Example:
#include <stdio.h> int main() { char *str = "Hello World"; str[0] = 'h'; // Trying to modify read-only memory = error return 0; }
Fix:
Store the string in a modifiable character array, or dynamically allocate memory for it:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { // Option 1: Use a character array char str[] = "Hello World"; str[0] = 'h'; // Totally allowed printf("%s\n", str); // Option 2: Dynamic allocation char *dyn_str = (char*)malloc(strlen("Hello World") + 1); if (dyn_str != NULL) { strcpy(dyn_str, "Hello World"); dyn_str[0] = 'h'; printf("%s\n", dyn_str); free(dyn_str); } return 0; }
At its core, an Access Violation means your program is trying to access memory it doesn’t have permission to use—whether that’s a null address, out-of-bounds array space, already freed memory, or read-only storage. As a beginner, double-checking pointer initialization, array bounds, and memory cleanup will help you avoid most of these issues.
内容的提问来源于stack exchange,提问作者masiboo

