2011-07-19 55 views
4

我需要有兩個參數傳遞給shell腳本,這裏是代碼:段錯誤的sprintf [C]

#include <stdio.h> 

#include <stdlib.h> 

void main() 
{ 
char *script; 
int lines = 1; 
sprintf(script, "/...path.../line.sh %d %d", lines, lines); 
system(script); 
} 

腳本效果很好,我已經盡力了。但我總是得到Segmentation錯誤。問題是:爲什麼?

感謝

+0

BTW:'main'應該返回'int',不'void'。 – littleadv

+0

這是一個非常基本的問題,但只是爲了您的信息/教育:我最近開始使用'Valgrind'的memcheck工具和它的真棒。你實際上可以看到/理解你的大部分mem相關問題和段錯誤。在你的武器庫中總是有好的工具。 – hari

回答

5

您寫這封信是由位置尚未分配的任何內存script指着內存。

試着這麼做:

#include <stdio.h> 

#include <stdlib.h> 

void main() 
{ 
    char script[100]; // Allocate as much as you need here for your string, not 
    int lines = 1; // necessarily 100 
    sprintf(script, "/...path.../line.sh %d %d", lines, lines); 
    system(script); 
} 
+0

感謝您的簡單解釋 - 被困在一小時這個愚蠢的錯誤:/ – Shark

2

您沒有爲script分配任何內存。

char *script;創建一個指針,但它必須指向你已經分配的東西,在你的情況下它的值是未定義的。完成後使用malloc分配內存,並使用free

3

您需要爲script

char *script = malloc(/* string size */); 

爲了能夠使用它分配空間。

+0

這是什麼在這裏downvote?無可否認,它可能會更好一些,但這個答案並不正確。 –

+0

@Platinum Azure:我也想知道。誰知道?我只是刪除大括號,並放置意見。 – sidyll

+1

我會給你取消upvote。 –

0

sprintf會嘗試將結果字符串寫入script,該字段尚未初始化。

0

您沒有爲變量script分配任何內存。 sprintf函數期望它的第一個參數是一個指向已經分配的內存的指針,但是您的script從不初始化,這意味着它是空的或垃圾。

1

改變這一行:

char *script; 

這樣:

char script[255]; 
0

要格式化成 「腳本」 沒有分配任何內存接收格式化字符串。

相反,分配:

char script[1024];